従来のプロジェクターで作業しているときに、ネットワーク経由でデータを転送するために 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 で他方がそうでない場合、メモリ レイアウトが同一であることが保証されているかどうかはわかりません。d.data
コンパイラは、POD 基本クラスの場合と同様に、DerivedFromPOD 型のオブジェクト d のアドレスと のアドレスが同じになるように DerivedFromPOD を配置する必要がありますか?