ホームページ > バックエンド開発 > C++ > C STL コンテナから継承する必要がありますか: リスクと代替案?

C STL コンテナから継承する必要がありますか: リスクと代替案?

DDD
リリース: 2024-11-26 14:13:10
オリジナル
991 人が閲覧しました

Should You Inherit from C   STL Containers: Risks and Alternatives?

C STL コンテナから派生するリスク

関数のオーバーロードやテンプレートの特殊化など、C STL コンテナからクラスを派生する潜在的な利点にもかかわらず、およびデバッグの改善には、これに関連する固有のリスクがあります。

次の例を考えてみましょう:

#include <vector>

class Rates : public std::vector<double> { };
class Charges : public std::vector<double> { };

int main() {
  auto p1 = new Rates;
  auto p2 = new Charges;
  kill_it(p2); // User code that knows nothing about Rates or Charges
  kill_it(p1);
  return 0;
}
ログイン後にコピー

kill_it 関数は、std::vector の非仮想デストラクターの実行中に被害者のメモリを削除します。これにより、Charges (派生クラス) では潜在的な問題が発生する可能性がありますが、Rates (typedef) では問題が発生しません。

この問題は、ユーザーが誤って kill_it 関数の ??? にエラーを導入した場合に発生します。セクション。たとえば、ユーザーが kill_it(p2) を呼び出す前に、Rates オブジェクトを指すように p2 を変更した場合、std::vector の非仮想デストラクタは、

このリスクを軽減するには、STL コンテナを処理するときに派生ではなく合成を使用することが一般的に推奨されます。構成により、より柔軟でエラーが発生しにくいアプローチが可能になります。

以上がC STL コンテナから継承する必要がありますか: リスクと代替案?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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