0

仮想デストラクタを含むクラス「base」があり、VTableとそれに対応するVTPRがあり、そこから派生したクラスがあります。

class base {
public:
    virtual ~base() {}
};

class der : base {};

main()
{

    int a = sizeof(base); // = 4 , fine !

    int b = sizeof(der);  // = 4 too ?
}

派生クラスも仮想であるため、独自のVPTRがありますが、VPTRを含む基本クラスのサブオブジェクトもあるため、クラス「der」のサイズを8バイトにしないでください。クラス'der'のVPTRのサイズ+クラス'base'のサブオブジェクトのVPTRのサイズ?(sizeof(void *)= 4バイトの場合)。

したがって、基本的に私の質問は次のとおりです。クラス「base」のサブオブジェクトが「der」で作成された場合、別の新しいVPTRがありますか?もしそうなら、なぜ'der'のサイズを計算しているときにそのサイズが追加されないのですか?

誰かがこれを明確にしてくれませんか。

4

2 に答える 2

4

これはすべて実装固有です。ただし、実際には、派生クラスにはvptrが1つしかありません。2つは必要ありません。vptrの要点は、仮想関数の正しいオーバーライドを動的に呼び出すために使用されるものです。derオブジェクトは、単にオブジェクトへの異なるポインタ値を持ちbaseます。

[注:あなたの例は、より一般的なパブリック継承ではなく、プライベート継承を(意図せずに?)使用しているという事実によっておそらく混乱しています...]

于 2012-06-05T14:36:59.363 に答える
2

vtables と vptrs を混同していると思います。各クラスには vtable があり、各オブジェクトはその vtable へのポインターを vptr として格納します。vtable は静的グローバルのようなもので、クラスのすべてのインスタンス間で共有されるため、オブジェクト内でスペースを取りません。

于 2012-06-05T14:45:09.337 に答える