2011-11-04 3 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の内部にAのクラス名が挿入されているために、ACの中に隠れているためです。 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++継承モデルを煩雑にすることなくできることはどれですか。私的継承は継承の構成ではなく、同じセマンティクスを使用して2つの別々の概念を達成するのは紛らわしいだけです。 – rerun

+2

構図と私的継承の違いは、後者はあなたの父親の保護されたメンバーにアクセスすることができるからです。 – bitmask

関連する問題