我的应用程序通过网络收到byte[]
,其中包含一个不受我控制的固定大小结构的成员表示。我们称之为Data
:
struct Data {
int id;
int count;
}
这很好用:
char buffer[]; // filled with bytes from the network...
Data data;
memcpy(&data, data, sizeof(Data));
现在,我希望从具有(纯)虚函数的类继承Data
类型:
struct Data : public SomethingVirtual {
int id;
int count;
}
以上代码不再有效。对于虚拟类,实例的前N个字节似乎包含指向vtable的指针,因此数据是偏移的。
我可以增加调用memcpy
的指针,但我现在想知道这种方法是否被误导。如果可能的话,我想避免使用太多的间接层或内存复制层。理想情况下,这种方法应该适用于架构和编译器,尽管我主要使用g ++来定位i686。
这个问题的解决方案是什么?
答案 0 :(得分:3)
一旦你从某些东西中获得它并且它有虚拟的成员,它就不再是POD了。您最好的解决方案是序列化到您的数据结构中,然后在平凡的数据上构建您的虚拟类。
struct Data
{...}
struct AddedValue : public SomethingVirtual
{
AddedValue(Data)
private:
Data MyData;
}
答案 1 :(得分:2)
您不能在非POD类型上使用memcpy。可能的解决方案是使用聚合而不是继承。并且将Data作为成员值,仍然是POD类型,因此可以在memcpy中使用。