Допустим, у нас есть класс с именем Derived, который наследуется от класса с именем Base. Два класса содержат только данные, которые находятся в областях непрерывной памяти. Можно ли отправить объект производного класса по сети без реализации какой-либо специальной функции для сериализации и десериализации члена объекта? Что будет с vtable? Vtable сохраняет реальный адрес производных функций или просто смещение?
Посмотрите на следующий фрагмент кода
#include "pch.h"
#include <iostream>
#include "Base.h"
class Derived : public Base
{
public:
char dummy[100];
int c;
~Derived()
{
}
void serialize(RtpComMsg_t msg)
{
msg.length = sizeof(*this);
msg.data = reinterpret_cast<unsigned char *>(this);
std::cout << "1.msg length" << msg.length << std::endl;
}
};
void Base::serialize(RtpComMsg_t msg)
{
msg.length = sizeof(*this);
msg.data = reinterpret_cast<unsigned char *>(this);
std::cout << "msg length" << msg.length << std::endl;
}
//receive from network
void deserialize(void * data)
{
Derived *d = reinterpret_cast<Derived *>(data);
}
int main()
{
Base *b = new Derived() ;
b->a = 5;
memcpy(((Derived*)b), "0xABCDEF", sizeof("0xABCDEF"));
((Derived*)b)->c = 10;
RtpComMsg_t msg{};
b->serialize(msg);
unsigned char temp[sizeof(Derived)];
memcpy(temp, b, sizeof(Derived));
//send temp to network
return 0;
}