[英]C++ - Why isn't this structure of diamond inheritance cause an ambiguity?
我已經掃描了數十個 inheritance 問題,但無法找到該問題的答案。
我明白為什么這不會編譯:
struct B{
virtual void f(){
printf("B");
}
};
struct C1 : virtual B{
void f() override{
printf("C1");
}
};
struct C2: virtual B{
void f() override{
printf("C2")
}
};
struct D: C1,C2{
};
因為沒有辦法確定哪個f
應該在B
的 vtable 中。
但是,我很驚訝地看到這段代碼可以編譯:
struct B{
virtual void f(){
printf("B");
}
};
struct C1 : virtual B{
void f() override{
printf("C1");
}
};
struct C2: virtual B{
};
struct D: C1,C2{
};
我的(錯誤的)直覺是我們仍然有兩條從D
到B
的路徑,並且在每一條中f
被覆蓋的最后一個位置是不同的 - 在一條路徑中它在C1
中,在一條路徑中它在B
中,但這確實可以編譯。
為什么這不會引起歧義?
因為 C1::f1 覆蓋 B::f1,它將優先用於任何具有 C1 動態類型或任何子類的 object。
在模棱兩可的情況下,雖然 C1::f1 和 C2::f1 都覆蓋了 B::f1,但它們不會相互覆蓋,因此它們之間存在歧義——它們都覆蓋了一個公共基礎 function 的事實是無關緊要的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.