25

次の C++ コードを見てください。

class Base1 {  
public:  
    Base1();  
    virtual ~Base1();  
    virtual void speakClearly();  
    virtual Base1 *clone() const;  
protected:  
    float data_Base1;  
};  

class Base2 {  
public:  
    Base2();  
    virtual ~Base2();  
    virtual void mumble();  
    virtual Base2 *clone() const;  
protected:  
    float data_Base2;  
};  

class Derived : public Base1, public Base2 {  
public:  
    Derived();  
    virtual ~Derived();  
    virtual Derived *clone() const;  
protected:  
    float data_Derived;  
}; 

《C++ オブジェクト モデルの内部》4.2 には、クラス Base1、Base2、および Derived の仮想テーブル レイアウトは次のように記述されています。 ここに画像の説明を入力

ここに画像の説明を入力

私の質問は:

クラス Derived の Base1 サブオブジェクトの仮想テーブルには が含まれていますBase2::mumble。なぜですか?Derived クラスがこの仮想テーブルを Base1 と共有していることはわかっているので、Base2 の関数はここに表示されるべきではないと思います。誰か教えてください。どうも。

4

2 に答える 2

-2

実行時に取得した場合:

    Base2 b2;
    Base1* b1_ptr = (Base1*)&b2;
    b1_ptr->mumble();    // will call Base2::mumble(), this is the reason.

次に Base2::mumble() を呼び出す必要があります! mumble() が階層でオーバーライドされた唯一の仮想メソッドであることに注意してください。(でも、 clone() もオーバーライドされていると思うかもしれませんが、それはクラス間で異なる型を返すので、それは別の署名です)。

于 2016-03-13T13:40:47.777 に答える