1

下面的代碼:C++多重繼承私有成員ambigious訪問

class A1 { 
public: 
    int x; 
}; 
class A2 { 
private: 
    int x() { return 67; } 
}; 

class M : public A1, public A2 {}; 

int main() { 
    M m; 
    m.x; 
} 

編譯錯誤:

error C2385: ambiguous access of 'x' 
note: could be the 'x' in base 'A1' 
note: or could be the 'x' in base 'A2' 

但是,爲什麼?只有A1::x應可見M. A2::x應該是純粹的本地。

+1

在C++中,*名稱查找*發生之前*進行成員訪問檢查*。 – WhiZTiM

+0

您之前提出的問題: http://stackoverflow.com/questions/6397938/ambiguous-access –

回答

3

在C++中,name-lookup發生在執行member access checking之前。因此,名稱查找(在您的情況下不合格)會找到兩個名稱,這是不明確的。

您可以使用一個合格的名稱來消除歧義:

int main() { 
    M m; 
    m.A1::x;  //qualifed name-lookup 
} 
+0

@ tower120,no。這與ADL無關。 [Koenig Lookup](http://en.cppreference.com/w/cpp/language/adl)在對非成員函數進行非限定查找時發揮作用 – WhiZTiM

+0

順便說一句,這是歷史性的,還是由設計(爲某事)?對我來說,起初,這看起來像一個編譯器錯誤,但現在它看起來像一個語言錯誤:) – tower120

+1

不,它不是一個語言錯誤。這是您希望訪問控制影響名稱查找的問題。如果訪問控制受到影響的名稱查找(例如,改變了可以接受的匹配項),那麼只需簡單地將'private'改爲'public'或者將'private'改爲'public',就可以很容易地(有意或無意地)以意想不到的方式顯着改變工作代碼的行爲,或者反之亦然。更好地提醒程序員含糊不清(正如你所發生的那樣),而不是讓代碼在小的變化面前變得脆弱。 – Peter