ホームページ > バックエンド開発 > C++ > C STL コンテナからの継承は危険ですか?

C STL コンテナからの継承は危険ですか?

Barbara Streisand
リリース: 2024-11-29 03:45:09
オリジナル
863 人が閲覧しました

Is Inheriting from C   STL Containers Risky?

C STL コンテナからの継承のリスク

提起される疑問は、標準 C コンテナからの継承に関連する実際のリスクがあるかどうかです。著者は、typedef std::vector などの typedef を使用すると主張します。料金; はより安全なアプローチです。ただし、潜在的な危険を調査するための特定の使用例を提案しています。

使用例

次のコード スニペットを考えてみましょう。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

#include <vector>

#include <iostream>

 

void kill_it(std::vector<double>& victim) {

    delete &victim;

}

 

typedef std::vector<double> Rates;

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

 

int main() {

  std::vector<double>* p1, *p2;

  p1 = new Rates;

  p2 = new Charges;

  kill_it(p2);

  kill_it(p1);

  return 0;

}

ログイン後にコピー

著者は、不運なユーザーが恣意的に ??? でエラーを引き起こす可能性があると示唆しています。このセクションは、Charges (派生クラス) では問題を引き起こしますが、Rates (typedef) では問題を引き起こしません。

Virtual Destructors

ここでの重要な問題は、その標準です。 C コンテナには仮想デストラクターがありません。したがって、それらを多態的に処理することはできません。あなたとあなたのコードのすべてのユーザーがこの原則に従うのであれば、標準コンテナから継承することは本質的に間違っているわけではありません。ただし、作者は明確にするために合成を推奨しています。

継承よりも合成

コンテナから継承する代わりに、合成を使用する方がクリーンで安全です。これには、コンテナのインスタンスをメンバー変数として含む新しいクラスの作成が含まれます。これにより、クラスの機能をより柔軟に制御できるようになります。

この使用例では、たとえば、std::vector のインスタンスを含む新しい Rates クラスを定義します。これにより、基礎となるコンテナーを活用しながら、追加の機能を追加できるようになります。このアプローチにより、基本コンテナーの実装に関係なく、新しいクラスのデストラクターが適切に処理されるようになります。

以上がC STL コンテナからの継承は危険ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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