在使用旧式投影仪时,我遇到了以下模式:POD 结构用于通过网络传输数据。
struct PODType {
// some data
int data;
};
在接收方,数据被接收到 POD 类型的对象中。稍后,从 PODType 派生一个类,并将接收到的对象以 C 风格的类型转换为派生类,以使用某些方法访问数据。
class DerivedFromPOD: public PODType {
public:
// some methods
int f(int x) {return data+x;}
protected:
// some methods
};
PODType pod;
receive(&pod);
DerivedFromPOD* d = (DerivedFromPOD*)&pod;
int i = d->f(10);
派生类具有公共和受保护的方法,因此它不再是 POD。我知道这是对继承的滥用,但它在代码库中已经存在很长时间了。
我想知道这是否可以保证从标准的角度(C++03 或 C++98)工作。派生类没有任何自己的数据成员或虚函数,但我不确定它是否保证内存布局是相同的,因为一个是 POD 而另一个不是。编译器是否被迫安排 DerivedFromPOD 使得d.data
' 的地址与 DerivedFromPOD 类型的对象 d 的地址相同,就像 POD 基类一样?