2013-03-01 149 views
0

讓我們假設情況。重複繼承。曖昧

struct Top 
{ 
    int x; 
}; 

struct Left : public Top 
{}; 

struct Right : public Top 
{}; 

struct Bottom : public Left, public Right 
{ 
    void foo() 
    { 
    Left::x; // Normal compiled 
    } 

    void goo() 
    { 
    Left::Top::x; // error: ‘Top’ is an ambiguous base of ‘Bottom’ // Why --- ???? 
    } 
}; 

有人可以解釋我爲什麼在函數goo()編譯器給出模糊性錯誤嗎?

我寫了void foo()來顯示如果我通過限定符Left :: x訪問x;沒有歧義,所以當我使用更詳細的訪問限定符Left :: Top :: x;歧義出現?

+0

順便說一下,我試過這個代碼在visual studio 2012(默認編譯器設置),它編譯。但gcc - 4.6(Ubuntu的)給出了這個錯誤。所以據我瞭解這是gcc - 4.6問題,或?我不知道,如果有人知道這件事,請寫下答案。 – 2013-03-04 14:12:46

回答

0

您的問題在OOP語言中稱爲「鑽石問題」。請記住::只是指導在哪裏找到某些東西,而不是如何明確地採取某個東西。在foo方法中,引用x,這是左邊已知的。這是迄今爲止的哦。但在方法goo中,你說「得到由Top知道的Top <」,這是Left所知道的。但是這個參考並沒有改變這個事實,你的班級Right也知道班級Top。所以在你的情況下,Left :: Top :: x和Top :: x是一樣的。 其結果是,它含糊不清,你想要的Top's x,Left所繼承的還是Right。當然,就你而言,它只是一種編譯器無法運行的單一類型。但這是一個共同的規則,這樣的東西可能會很快變得很奇怪;)