2

以下のひし形のシナリオを考えてみましょう。

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 のコードをコンパイルしています。

4

1 に答える 1

0

Derived4 は、Derived3 から継承したものを超えて、仮想関数または仮想基本クラスを追加していないため、サイズの増加はメンバー s のみです。

于 2013-04-28T21:51:52.263 に答える