ホームページ > バックエンド開発 > C++ > C で `std::string` からの継承を避けるべきなのはなぜですか?

C で `std::string` からの継承を避けるべきなのはなぜですか?

Barbara Streisand
リリース: 2024-12-29 06:21:10
オリジナル
858 人が閲覧しました

Why Should I Avoid Inheriting from `std::string` in C  ?

std::string からの継承の危険性

継承を使用するとコードの再利用性が得られますが、クラスの特定の要件を理解することが重要です。基本クラスとして機能します。 Effects C で強調されている重要な考慮事項の 1 つは、クラスがポリモーフィカルに動作する場合、クラスには仮想デストラクターが必要であるということです。

ただし、 std::string には仮想デストラクターがないため、仮想デストラクターからの継承について懸念が生じます。仮想デストラクターがないことが std::string からの継承を回避する唯一の理由であるかどうかという疑問が生じます。

C では、継承は主に 2 つの目的で使用されます。

  • プライベート継承: を使用したミックスインおよびアスペクト指向プログラミングの場合templates.
  • パブリック継承: 特にポリモーフィック シナリオの場合。

非ポリモーフィック継承は C では実用的な価値がなく、回避できます。無料の関数は、より適切な代替手段を提供し、クライアントにカスタム文字列クラスへの切り替えを強制せずにクラスを拡張できます。

スライスの問題

C では、クラスは次のようになります。他の OO 言語の参照型とは異なり、値型です。これにより、値渡しのオブジェクトが基本クラスのサイズに切り詰められ、不整合が生じるというスライスの問題が発生します。これは、以下のコード スニペットに示されています。

int StringToNumber(std::string copyMeByValue)
{
    // ... Your code to convert 'copyMeByValue' to a number.
}
ログイン後にコピー

std::string の派生オブジェクトをこの関数に渡すと、スライスの問題が発生し、予期しない動作が発生します。非派生関数は基本クラスのメンバーと密接に結合しているため、これらの不一致が発生する可能性があります。

結論

明示的に多態性の動作が必要な場合を除き、std::string からの継承は避けてください。 。コードを再利用できるようにするために、継承を目的としないクラス内の非メンバー関数およびメンバーを優先してください。この慣行に従うことで、コードの保守性を確保し、継承の不一致に関連する潜在的な問題を防ぐことができます。

以上がC で `std::string` からの継承を避けるべきなのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート