2011-11-04 65 views
14

g++拒絕我訪問某個類型,僅僅因爲它恰好是私人的父親。這有意義嗎?由於私人繼承導致的無法訪問類型

struct A {}; 

struct B : private A {}; 

struct C : B { 
    void foo(A const& a) {} 
}; 

編譯這產生了:

1:10: error: ‘struct A A::A’ is inaccessible 
6:12: error: within this context 

我的觀點是:我從來沒有想訪問A作爲祖先。實際上,如果AB的私人祖先,那麼除了B(即C)之外,不應該對任何人完全看不到?

當然,我可以使用protected繼承,但在我的情況下,它沒有任何意義。

回答

13

這是由於從A注入的類名稱隱藏在C內部的全球A。雖然A是可見的,但它不可訪問(因爲它是作爲私人導入的),因此是錯誤。您可以通過在全局命名空間中查找來訪問A

void foo(::A const& a) {} 
8

,如果你把它聲明如下它的工作原理

struct A {}; 

struct B : private A {}; 

struct C : B { 
    void foo(::A const& a) {} 
}; 

錯誤你看到的是做名稱解析無法訪問。 :: A表示查看全局命名空間,而不是我繼承的嵌套類類型。還要記住,私有繼承只是說B有一個A,而IMOHO是一個應該避免的愚蠢的語言特性。

+1

這不是一個愚蠢的功能;它允許通過單獨挑選用'using'公開的函數來限制繼承的接口。 – avakar

+2

你可以使用轉發器功能來完成這項功能,並使C++繼承模型變得更加混亂。私有繼承不是繼承,其組成和使用相同的語義來完成兩個單獨的概念只是混淆。 – rerun

+2

這是組成和私人遺產之間的區別,因爲後者允許您訪問您父親的受保護成員,而前者不會。 – bitmask