ダイアモンド型の継承はあいまいさを引き起こし、継承を使用することで回避できることを理解してvirtual Base Classes
います。問題はそれに関するものではありません。問題は、クラスがポリモーフィックである場合の、ひし形の階層で最も派生したクラスのサイズについてです。サンプルコードとサンプル出力は次のとおりです。
#include<iostream>
using namespace std;
class Base
{
public:
virtual void doSomething(){}
};
class Derived1:public virtual Base
{
public:
virtual void doSomething(){}
};
class Derived2:public virtual Base
{
public:
virtual void doSomething(){}
};
class Derived3:public Derived1,public Derived2
{
public:
virtual void doSomething(){}
};
int main()
{
Base obj;
Derived1 objDerived1;
Derived2 objDerived2;
Derived3 objDerived3;
cout<<"\n Size of Base: "<<sizeof(obj);
cout<<"\n Size of Derived1: "<<sizeof(objDerived1);
cout<<"\n Size of Derived2: "<<sizeof(objDerived2);
cout<<"\n Size of Derived3: "<<sizeof(objDerived3);
return 0;
}
私が得る出力は次のとおりです。
Size of Base: 4
Size of Derived1: 4
Size of Derived2: 4
Size of Derived3: 8
私が理解しているようBase
に、仮想メンバー関数が含まれているため、
この環境では、sizeof Base=vptrのサイズ=4です。
Derived1
ケースとDerived2
クラスも同様です。
上記のシナリオに関連する私の質問は次のとおりです。クラスオブジェクト
のサイズはどうDerived3
ですか。Derived3クラスに2つのvptrがあるということですか?
クラスはこれらの2つのvptrでどのDerived3
ように機能しますか、それが使用するメカニズムについてのアイデアはありますか?
クラスのsizeofは、コンパイラの実装の詳細として残され、標準では定義されていません(仮想メカニズム自体はコンパイラの実装の詳細であるため)?