我有以下代碼示例:多重繼承,選擇虛擬函數調用
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->試驗()和B->試驗()是不明確的太如對象a是C並因此繼承自A和B,兩者具有相同的Test()函數。但是,它們都調用與delcared類型相對應的實現,而不是實際對象的類型。
任何人都可以解釋爲什麼這些調用不含糊? C++總是以這種方式表現嗎?
所以它的設計行爲是在這種情況下,編譯器總是從聲明的類型中調用函數(假設它不會被一個後代覆蓋),也就是說我可以依賴它來始終發生在編譯器上嗎? – Stefan
請參見http://en.wikipedia.org/wiki/Virtual_method_table#Multiple_inheritance_and_thunks,它表示多個虛擬表副本是多重繼承的「最常見」實現。我想如果你不使用異國情調的編譯器,這可能是一個可靠的行爲 – dweeves
這是完美的,謝謝。 – Stefan