以下のひし形のシナリオを考えてみましょう。
class Base {
int x;
public:
virtual ~Base(){}
};
class Derived1 : virtual public Base {
int y;
};
class Derived2 : virtual public Base {
int z;
};
class Derived3 : public Derived1, public Derived2 {
int t;
};
- Baseのサイズは8 [ x(4) + vptr(4) (仮想デストラクタから) ]
- Derived1のサイズは16 [ x(4) + y(4) + vptr(4) (仮想デストラクタから) + vptr(4) (仮想継承から) ]
- Derived2のサイズは16 [ x(4) + z(4) + vptr(4) (仮想デストラクタから) + vptr(4) (仮想継承から) ]
- Derived3のサイズは28 [ x(4) + y(4) + z(4) + t(4) + vptr(4) (仮想デストラクタから) + 2 x vptr(4) (Derived1 と Derived2 の仮想継承から) ) ]
ここで、 Derived 3から派生した別のクラスDerived4を追加すると、
class Derived4 : public Derived3 {
int s;
};
サイズは32になります (これは Derived3 + s のサイズであると想定しています)。
Derived4内に仮想ポインタがないかどうか知りたいですか?
通常のクラス階層 (ひし形構造なし) を使用する場合、基本クラスに仮想関数がある場合、すべての派生クラスには vptrs があります。では、なぜこの場合ではないのでしょうか。
GNU GCC コンパイラを使用して codeBlocks 12.11 のコードをコンパイルしています。