1

次のコードの O/P に違いがある理由を説明してください... 1> クラス A と B に仮想継承を使用すると、B::f が呼び出されます 2> A と B に仮想継承がない場合次に、L::f が呼び出されます

仮想関数と非仮想関数の仮想継承/非仮想継承とポインターキャストのさまざまな組み合わせを使用する場合、ほとんどのo/p ORエラーはきっとあなたを驚かせるでしょう。

そのため、C++ コンパイラが常に従ういくつかの一般的な規則を探しています。つまり、コードをコンパイルまたは実行せずに o/p OR エラーを予測するにはどうすればよいでしょうか。

#include <iostream>
using namespace std;

class L{
    public :
    virtual void f(){
    cout<<"L::f()"<<endl;
    }
};

class A: public virtual L{
    public : 
    /*
    virtual void f(){
    cout<<"A::f()"<<endl;
    }
    */
};

class B : public virtual L{
    public :
    virtual void f(){
        cout<<"B::f()"<<endl;
    }
};

class C : public B, public A {
    public :
    /*
    virtual void f(){
        cout<<"C::f()"<<endl;
    }
    */
};

int main(){

    A* ptr = new C();
    ptr->f();
    return 0;
} 
4

0 に答える 0