次のコードサンプルがあります。
class A
{
public:
A(int a):AA(a) {};
int AA;
virtual int Test()
{
return AA;
};
};
class B
{
public:
B(int b):BB(b) {};
int BB;
virtual int Test()
{
return BB;
};
};
class C:public A, public B
{
public:
C(int a, int b, int c) :A(a),B(b),CC(c) {};
int CC;
};
int main()
{
A *a = new C(1,2,3);
B *b = new C(1,2,3);
C *c = new C(1,2,3);
int x = a->Test() ; // this is 1
int y = b->Test() ; // this is 2
// int z = c->Test() ; // this does not compile
return 0;
}
オブジェクトaはCであり、したがって、両方とも同じTest()関数を持つAとBを継承するため、a-> Test()とb-> Test()の呼び出しもあいまいになると予想していました。ただし、どちらも、オブジェクトが実際にあるタイプではなく、削除されたタイプに対応する実装を呼び出します。
これらの呼び出しがあいまいでない理由を誰かが説明できますか?C ++は常にこのように動作しますか?