2012-03-31 5 views
6

公的および私的な継承についてはっきりしていますが、保護についてはどうですか?私たちが実際にそれを使用する必要がある場合のどのような例でも、私たちは利益をもたらしますか?保護された継承が必要なケース

+0

'giveы':こんにちはロシア:) – iehrlich

+2

関連から:[保護された継承](のhttp:// stackoverflowの.com/questions/2090661/protected-inheritance) – ipc

+2

C++のすべての部分が有用なわけではありません。一般的なスキームにきれいに収まるので、保護された継承のような機能を*定義するのは当然ですが、それは広く(あるいはまったく)有用ではありません。明示的に設計されたものでも、 'valarray'、' export'、 'vector 'や例外仕様のように有用ではないことが判明しました。 –

答えて

3

base-from-memberイディオムは、時々保護された継承を必要とします。

アドレスをイディオム問題は以下の通りです:

struct foo 
{ 
    virtual ~foo() {} 

protected: 
    foo(std::ostream& os) 
    { 
     os << "Hello !\n"; 
    } 
}; 

struct bar : foo 
{ 
    bar(const char* filename) 
     : foo(file), file(filename) // Bad, file is used uninitialized 
    {} 

private: 
    std::fstream file; 
}; 

しかしfilefooを構築しているようにあなたは時々、派生クラスのメンバーで基本クラスを初期化する必要があるため、 ostreamfoo::fooに渡されました。無効です。

あなたは、補助クラスとプライベート継承してこの問題を解決:

struct bar_base 
{ 
    std::fstream file; 

protected: 
    bar_base(const char* filename) 
     : file(filename) 
    {} 

    ~bar_base() {} 
}; 

struct bar : private bar_base, public foo 
{ 
    bar(const char* filename) 
     : bar_base(filename), foo(file) 
    {} 
}; 

は今bar_basefoo前に構築され、そしてfoo::fooに渡されたostreamは有効です。

あなたがbarの保護されたメンバーになるfileをしたい場合は、保護された継承を使用する必要があります。

struct bar : protected bar_base, public foo { ... } 
2

protectedは、サブクラスからはアクセスできますが、外部からはアクセスできないことを意味します。

非常に単純な例は、内部計算を行うために変数(たとえばx)を使用するクラスです。サブクラスが同じ計算を行う必要がある場合は、おそらくxにアクセスする必要があります。それを非公開にすることで、サブクラスがアクセスするのを避けることができます。公開すると、すべての人がアクセスできるようになります。保護はトレードオフのようなものです。

+2

質問は保護された継承に関するものです。 'class a:protected b '、保護されたメンバーではありません。 –

4

保護された継承は、私にこの日までの意味がわかりません。

これは、保護された継承に関するScott Meyersの意見(Effective C++、第3版)です。

しかし、このページは面白いです:Effective C++: discouraging protected inheritance?

0

プロテクトは、子供の知識を念頭に置いて書かれたスーパークラスを抽象化するのに特に便利です。保護されたメンバーとメソッドは、子どもが利用でき、その時点で実装されているクラスのファミリ以外の世界にそれらを公開することなく、コードの複製を保存できます。

+2

質問は、保護されたメンバーではなく、 'class a:protected b'という保護された継承についてです。 –

関連する問題