Я начинаю со следующего кода:
#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;
}
Как я могу получить данные только производной части класса?
Он взломан, он может работать в вашем случае:
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;
вместо.
sizeof(static_cast<Base>(derived)) + 1
- это простоsizeof(Base) + 1
? И вместоmemcpy
вы могли бы просто написать: a { 'b', 'a', 's', 'e' }
. И вам не нужно(void)
, просто()
будет делать.(void)
был создан моей IDE, иmemcpy
легче редактировать, потому что мне не нужно разбивать строку на отдельные символы.