Как изолировать данные (сериализацию) производного класса?

0

Я начинаю со следующего кода:

#include <iostream>

class Base
{
private:
    char a[4];
public:
    Base(void){memcpy(a, "Base", 4);}
    ~Base(void){}
};

class Derived :
    public Base
{
private:
    char b[8];
public:
    Derived(void){ memcpy(b, "Derived", 8);}
    ~Derived(void){}
};

Чтобы извлечь данные базового класса, я бы сделал следующее:

int main(void)
{
    Derived derived;

    char* onlyBase = new char[sizeof(Base) + 1];//+1 for '\0'
    memcpy(onlyBase, &static_cast<Base>(derived), sizeof(Base));
    onlyBase[sizeof(Base)] = '\0';

    std::cout << onlyBase;
}

Как я могу получить данные только производной части класса?

  • 0
    Почему ты пишешь что-то такое супер громоздкое и бессмысленное? Конечно, sizeof(static_cast<Base>(derived)) + 1 - это просто sizeof(Base) + 1 ? И вместо memcpy вы могли бы просто написать : a { 'b', 'a', 's', 'e' } . И вам не нужно (void) , просто () будет делать.
  • 0
    Ну, да. Я отредактирую это. (void) был создан моей IDE, и memcpy легче редактировать, потому что мне не нужно разбивать строку на отдельные символы.
Показать ещё 2 комментария
Теги:
c++11
inheritance
derived-class

1 ответ

0

Он взломан, он может работать в вашем случае:

char* onlyDerived = new char[sizeof(Derived) - sizeof(Base) + 1];//+1 for '\0'
memcpy(onlyDerived, &reinterpret_cast<const char*>(&derived) + sizeof(Base), sizeof(Derived) - sizeof(Base));
onlyDerived[sizeof(Derived) - sizeof(Base)] = '\0';

Я не хочу, чтобы вы делали такие вещи, у вас может быть несколько проблем (не переносимых..., выравнивание, отступы, сущность...).

Вы можете сделать что-то вроде: char* Base::serialize() const; вместо.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню