我正在研究與多繼承相關的主題。我想出了下面的代碼,並可能不能完全弄清楚機制背後:多態如何工作涉及多重繼承?
struct root
{
virtual void vfunction(){ /* root version */ }
};
struct mid1:public root
{
virtual void vfunction(){ /* mid1 version */ }
};
struct mid2:public root
{
virtual void vfunction(){ /* mid2 version */ }
};
struct inheritMulti:public mid1, public mid2
{
void ambiguityMethod(){
vfunction(); // error: ambiguous
}
void method1(){
mid1& t = *this;
t.vfunction();
}
void method2(){
mid2& t = *this;
t.vfunction();
}
};
的ambiguityMethod
是錯誤的,很明顯。但是,method1
和method2
中的函數調用讓我感到困惑。它們也是虛函數調用,並且t
實際上是inheritMulti
類型。所以他們應該叫inheritMulti
版本vfunction
,但由於inheritMulti
沒有自己的版本,我不知道會發生什麼。並且原來method1
中的呼叫調用mid1
版本,而method2
中的呼叫調用mid2
版本。它是未定義的東西,只發生在我的編譯器上?如果沒有,爲什麼它會這樣工作? vtable如何處理這種情況?謝謝!
感謝您的幫助。我已經搜索了關於自己的相關主題,所以是的,我知道「鑽石問題」。但我認爲我的問題與此不同。我主要關心的是method1
和method2
中的「虛函數調用」行爲是否由標準定義好或未定義。在編譯器中,它的行爲與我上面提到的一樣,但是標準所承諾的行爲是什麼?如果它是明確的,爲什麼它分別稱爲mid1
和'mid2'版本? (直觀的想法是調用inheritMulti
版本,因爲t
的類型實際上是inheritMulti
)而且,大多數編譯器如何處理這種情況?奇怪的是,method1
和method2
中的虛函數調用調用了不同的函數。再次感謝!
你認爲應該在這裏發生什麼? – Creris