簡體   English   中英

C++ - 為什么鑽石 inheritance 的這種結構不會引起歧義?

[英]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{
    
};

我的(錯誤的)直覺是我們仍然有兩條從DB的路徑,並且在每一條中f被覆蓋的最后一個位置是不同的 - 在一條路徑中它在C1中,在一條路徑中它在B中,但這確實可以編譯。

為什么這不會引起歧義?

因為 C1::f1 覆蓋 B::f1,它將優先用於任何具有 C1 動態類型或任何子類的 object。

在模棱兩可的情況下,雖然 C1::f1 和 C2::f1 都覆蓋了 B::f1,但它們不會相互覆蓋,因此它們之間存在歧義——它們都覆蓋了一個公共基礎 function 的事實是無關緊要的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM