使用memcpy从字节数组初始化虚拟类

时间:2013-04-17 15:37:38

标签: c++

我的应用程序通过网络收到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。

这个问题的解决方案是什么?

2 个答案:

答案 0 :(得分:3)

一旦你从某些东西中获得它并且它有虚拟的成员,它就不再是POD了。您最好的解决方案是序列化到您的数据结构中,然后在平凡的数据上构建您的虚拟类。

struct  Data
{...}

struct AddedValue : public SomethingVirtual 
{
   AddedValue(Data)
private:
   Data MyData;
}

答案 1 :(得分:2)

您不能在非POD类型上使用memcpy。可能的解决方案是使用聚合而不是继承。并且将Data作为成员值,仍然是POD类型,因此可以在memcpy中使用。