公的および私的な継承についてはっきりしていますが、保護についてはどうですか?私たちが実際にそれを使用する必要がある場合のどのような例でも、私たちは利益をもたらしますか?保護された継承が必要なケース
答えて
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;
};
しかしfile
にfoo
後を構築しているようにあなたは時々、派生クラスのメンバーで基本クラスを初期化する必要があるため、 ostream
がfoo::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_base
はfoo
前に構築され、そしてfoo::foo
に渡されたostream
は有効です。
あなたがbar
の保護されたメンバーになるfile
をしたい場合は、保護された継承を使用する必要があります。
struct bar : protected bar_base, public foo { ... }
protected
は、サブクラスからはアクセスできますが、外部からはアクセスできないことを意味します。
非常に単純な例は、内部計算を行うために変数(たとえばx
)を使用するクラスです。サブクラスが同じ計算を行う必要がある場合は、おそらくx
にアクセスする必要があります。それを非公開にすることで、サブクラスがアクセスするのを避けることができます。公開すると、すべての人がアクセスできるようになります。保護はトレードオフのようなものです。
質問は保護された継承に関するものです。 'class a:protected b '、保護されたメンバーではありません。 –
保護された継承は、私にこの日までの意味がわかりません。
これは、保護された継承に関するScott Meyersの意見(Effective C++、第3版)です。
しかし、このページは面白いです:Effective C++: discouraging protected inheritance?。
プロテクトは、子供の知識を念頭に置いて書かれたスーパークラスを抽象化するのに特に便利です。保護されたメンバーとメソッドは、子どもが利用でき、その時点で実装されているクラスのファミリ以外の世界にそれらを公開することなく、コードの複製を保存できます。
質問は、保護されたメンバーではなく、 'class a:protected b'という保護された継承についてです。 –
- 1. 保護されたメンバの継承
- 2. 継承された後の保護されたメンバの動作。
- 3. 保護されたフィールドの微妙なC++継承エラー
- 4. 重要なクラスを継承するケース?
- 5. 継承を持つ保護されたメンバー
- 6. Node.js必要なプロトタイプ継承
- 7. 継承 - ガイダンスが必要
- 8. 異なるパッケージのクラスによるパッケージ保護されたメソッドの継承
- 9. SpringセキュリティWebSecurityConfigにはセキュリティ保護されたゾーンと保護されていないゾーンが必要です
- 10. 継承された保護されたメンバーを使用して問題が発生しました(C++)
- 11. 継承を介して内部クラスの保護されたフィールドにアクセス
- 12. 保護されたデータ型のクラスから継承する方法は?
- 13. 保護された変数は継承されたクラスでプライベートになりますか?
- 14. オーバーライドされた要素のCSS継承
- 15. 継承とコンストラクタコードで支援が必要
- 16. 継承のために保護された変数を宣言しないでください。
- 17. 継承されたコードでのforステートメントの解釈支援が必要
- 18. "継承された抽象メソッドを実装する必要があります"
- 19. クラス継承が期待どおりに継承されない
- 20. JPA:継承テーブルに継承が挿入されない
- 21. @継承されたアノテーションは継承されていません
- 22. パスワードで保護されたdocxファイルを開くためのJavaコードが必要
- 23. 読み取り専用プロパティ継承:抽象的なまたはセット保護
- 24. セキュリティで保護された_vsnprintf_sで必要なバッファ長を取得する
- 25. GWT継承されたモジュール
- 26. 継承された属性
- 27. パイソン - 継承されたメソッド
- 28. 継承されたテキストデコレーションスタイル
- 29. 継承されたオブジェクト
- 30. 親密なネストされたクラス継承
'giveы':こんにちはロシア:) – iehrlich
関連から:[保護された継承](のhttp:// stackoverflowの.com/questions/2090661/protected-inheritance) – ipc
C++のすべての部分が有用なわけではありません。一般的なスキームにきれいに収まるので、保護された継承のような機能を*定義するのは当然ですが、それは広く(あるいはまったく)有用ではありません。明示的に設計されたものでも、 'valarray'、' export'、 'vector'や例外仕様のように有用ではないことが判明しました。 –