2014-09-20 35 views
8

我試圖訪問成員變量x in struct 頂部使用底部對象。使用多重繼承時,爲什麼這個限定名稱不明確?

的代碼如下:

#include <cstdio> 

struct Top 
{ 
public: 
    int x = 1; 
}; 

struct Left : public Top 
{ 
    int x = 2; 
}; 

struct Right : public Top 
{ 
    int x = 3; 
}; 

struct Bottom : public Left, public Right 
{ 
    int x = 4; 
}; 

int main() 
{ 
    Bottom b; 
    std::printf("value: %d\n", b.Left::Top::x); 
    return 0; 
} 

這給使用gcc 4.8以下錯誤:

main.cpp: In function 'int main()': 
main.cpp:27:45: error: 'Top' is an ambiguous base of 'Bottom' 
std::printf("value: %d\n", b.Left::Top::x); 
             ^

這是怎麼含糊,我怎麼有資格名稱訪問它?

+0

「Left」和「Right」都從'Top'繼承,並且都有數據成員'x'。因此含糊不清。 – 2014-09-20 19:49:54

+0

它是不明確的,因爲你有'Left'和'Right'作爲'Top'的子類,每個子類定義'x'。如果'Bottom'子類都是這兩個類,那麼你不能從'Left'或'Right'確定'x'。爲了記錄,您的限定名稱不是含糊不清的,您的繼承結構是。 – 2014-09-20 19:51:14

+3

我知道訪問多重繼承鑽石的不合格成員是不明確的。這裏的問題是,爲什麼如果我完全符合條件,它仍然是模棱兩可的。例如,如果我首先靜態地投射到左側,然後到頂端,我可以訪問正確的x值。爲什麼它不適用於合格的名稱? – anoncoder 2014-09-20 20:22:54

回答

4

問題是C++沒有辦法直接表達「多級」類成員的概念,如「LeftTop子對象的成員x」。 Left::Top::x意思是「Left::Top表示的類型中的成員x」,Left::Top表示的類型恰好爲Top

這就是爲什麼你可以寫奇怪的事情像

int Left::* ptr = &Right::Top::x; 

因爲=的右手邊是完全等同於&Top::x,和一個指針到基類成員隱式轉換爲一個指針到派生類成員。 (此轉換的結果仍然指派生類的基類子對象中的成員。)

要消除歧義,您可以按照static_cast<Left &>(b).Top::x的行執行某些操作,也可以使用指向成員的指針int Left::* ptr = &Top::x;,b.*ptr將參考Left子對象bTop子對象中的x

相關問題