std::string から継承することが推奨されない理由
Effective C では、仮想デストラクターは、クラスが多態性の動作を示す能力にとって非常に重要です。したがって、std::string に仮想デストラクターが存在しないと、仮想デストラクターからの派生が事実上禁止されます。これにより、次のような疑問が生じます: 適切な基本クラスとして資格を得るには、クラスが満たさなければならない追加の基準は何ですか?
基本クラス ステータスの資格
暗黙の仮定に反して質問では、クラスは基本クラスとして機能するためにポリモーフィズムをサポートする必要はありません。 C の継承は、次の 2 つの主な目的を果たします。
基本クラスとしての std::string
その理由は、仮想デストラクターがないことだけではありません。 std::string は、ポリモーフィックであろうとなかろうと、基本クラスとして機能することを意図したものではありません。これは、C のクラスのプロパティに起因すると考えられます。
クラスが参照型である他のオブジェクト指向言語とは異なり、C はクラスを値型として扱います。その結果、基本クラス オブジェクトがコピーされると、そのメンバーのみがコピーされ、派生クラスのメンバーはコピーされません。スライシング問題として知られるこの現象は、不整合や誤った動作を引き起こす可能性があります。
したがって、メソッド拡張の継承を実装するのではなく、非フレンド、非メンバー関数を利用することが C のベスト プラクティスと考えられています。または構成。継承は、テンプレートのメタプログラミングまたはポリモーフィック動作の確立のために予約する必要があります。
非ポリモーフィック継承の防止
基本クラスがコードの再利用のみを目的としている場合には、次のようなものがあります。派生クラスへのポインターの作成を防ぐ効果的な方法はありません。ただし、プライベート継承を使用したり、派生クラス メソッドのアクセスを制限したり、パブリック基本クラス メソッドを回避したりすると、その使用が妨げられる可能性があります。
以上が`std::string` からの継承を避けるべき理由は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。