std::string からの継承の危険性
継承を使用するとコードの再利用性が得られますが、クラスの特定の要件を理解することが重要です。基本クラスとして機能します。 Effects C で強調されている重要な考慮事項の 1 つは、クラスがポリモーフィカルに動作する場合、クラスには仮想デストラクターが必要であるということです。
ただし、 std::string には仮想デストラクターがないため、仮想デストラクターからの継承について懸念が生じます。仮想デストラクターがないことが std::string からの継承を回避する唯一の理由であるかどうかという疑問が生じます。
C では、継承は主に 2 つの目的で使用されます。
非ポリモーフィック継承は 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 サイトの他の関連記事を参照してください。