0

次のコードでは、_tmain(..) で D::f を呼び出すとあいまいなエラーが発生します。これは、B::f が A::f をオーバーライドし、A::vtable の f へのポインターが B::f を指しているためです。

1) コンパイラがあいまいなエラーを出すのはなぜですか? 誰かがそれをクリアしてもらえますか?

2) B::f(int) を B::f(char) に変更して A::f(int) をオーバーロードしようとしましたが、エラーは消えませんでした! 何故ですか?

継承図:

............A......
........../.|.\....
........A1..B..C...
..........\.|./....
............D......

コード:

struct A { 

 virtual void f(int x) {cout << "A::f";}; 
 virtual void g(int x) {cout << "A::g";}; 
 private: int n; 
}; 
struct A1: A { 
 virtual void h(int x) {f(x);}; 
}; 
struct B : virtual A { 
 void f(int x) {cout << "B::f";}; 
}; 
struct C : virtual A { 
 void g(int x) {cout << "C::g";}; 
}; 
struct D : A1, B , C { 

};
int _tmain(int argc, _TCHAR* argv[])
{
    D* d = new D();
    d->f(1);
    return 0;
}
4

1 に答える 1