ポリモーフィズム: 基本クラス ポインターから派生クラス インスタンスのコピーを作成する
オブジェクト指向プログラミングでは、必要なシナリオがよく発生します。多態性基本クラスへのポインターを介して派生クラス インスタンスにアクセスしながら、派生クラス インスタンスのコピーを作成します。このタスクは、特に外部ライブラリや複雑なコード構造の使用を避ける場合には、困難になる可能性があります。
問題:
次のクラス階層を考えてみましょう:
<code class="cpp">class Base { virtual ~Base(); }; class Derived1 : public Base { ... }; class Derived2 : public Base { ... };</code>
目的は、base が指すインスタンスの動的に作成されたコピーを返すメソッド CreateCopy(Base* Base) を作成することです。実行時エラーを防ぐには、一時オブジェクトへの参照を返さないようにすることが重要です。
単純なアプローチ:
単純なアプローチでは、複数の typeid または Dynamic_cast を一連の if ステートメントを使用して特定の派生クラスの型を決定し、new 演算子を使用してコピーを作成します。ただし、このメソッドは面倒でエラーが発生しやすくなります。
より良いアプローチ:
よりエレガントで汎用性の高い解決策は、基本クラスに仮想メソッドを導入することです。
<code class="cpp">class Base { virtual ~Base(); virtual Base* clone() const = 0; };</code>
各派生クラスは、独自の clone() メソッドを実装して、インスタンスのコピーを作成します。
CRTP (Curiously Recurring Template Pattern):
各派生クラスで clone() 実装の重複を避けるために、テンプレート クラスを通じて CRTP イディオムを活用できます。
<code class="cpp">template <class Derived> class DerivationHelper : public Base { public: virtual Base* clone() const { return new Derived(static_cast<const Derived&>(*this)); // call the copy ctor. } };</code>
派生クラスは、Base から直接ではなく DerivationHelper から継承できるようになりました。 :
<code class="cpp">class Derived1 : public DerivationHelper<Derived1> { ... }; class Derived2 : public DerivationHelper<Derived2> { ... };</code>
このアプローチにより、各クラスに手動で実装する必要がなく、すべての派生クラスが clone() メソッドにアクセスできるようになります。
以上がC で基本クラス ポインターから派生クラス インスタンスのコピーを作成する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。