4

2 つのクラスがあり、一方が他方から継承され、子クラスに関数のみが含まれている場合、メモリ レイアウトは両方のクラスで同じになりますか?

例えば

class Base {
  int a,b,c;
};

class Derived: public Base {
  // only functions.
};

Derivedコンパイラはデータ メンバーの順序を変更できないことを読みましたが、クラスで多重継承は必要ありません。メモリ レイアウトが同じにならない状況はありますか? (クラスには複数の継承が必要な場合がありますBase)

4

5 に答える 5

3

BaseDerivedこちらの両方が標準のレイアウト クラスです。標準レイアウトは他の言語 (特に C) との相互運用を目的としているため、両方の言語でレイアウトが同じであることが期待できます。ただし、複数の継承をミックスに追加すると、結果は標準のレイアウト クラスになる場合とそうでない場合があります。上記のリンク先の投稿でそのルールを確認できます。

于 2012-07-09T22:40:39.113 に答える
1

現状では、両方のクラスのレイアウトは同じですが、派生型に仮想関数を追加すると、レイアウトが変更される(または少なくとも変更される可能性がある)ことに注意してください。

さて、説明から、あなたがやろうとしているのは、既存のクラスの上にメンバー関数を提供するタイプを作成することであるようです。その場合は、無料の関数を使用するなど、他の異なる設計を検討する必要があります(Cスタイル)。

于 2012-07-10T02:41:24.167 に答える
1

基本クラスへのポインターを介して派生インスタンスにアクセスできるため、レイアウトは同じである必要があります。

つまり、データ メンバーを追加したとしても、それらは同じままです。

これは、多重継承を使用した場合でも同じであることを意味します。
(ただし、その場合、参照しているベースのインスタンスstatic_castを指定するために、特に s を実行する必要がある場合があります。これは、派生クラスのポインターが基本クラスのポインターと同じである必要がないためです。)

于 2012-07-09T22:40:19.720 に答える
1

コンパイラによって異なりますが、最も一般的なコンパイラでは、あなたの仮定は正しいと思います。あなたが示唆するように、特定の作業には g++/gcc を使用しますが、他の作業についてはわかりません。

于 2012-07-09T22:40:39.913 に答える
0

それを頼りにしないでください。

しかし、一部の一般的なコンパイラでは、実際にはメモリ レイアウトが同じである場合があります。

于 2012-07-09T22:38:49.813 に答える