次のコードでは、_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;
}