多態性基本クラス ポインターからの派生クラス インスタンスのコピー
多くの人にとって、このプログラミングの難題はとらえどころのないものであることがわかっています。関連する複雑さを調べて、効率的な解決策を見つけてみましょう。
次のシナリオを考えてみましょう。Base、Derived1、Derived2 などのクラスがあり、派生クラスは Base から継承します。 Base オブジェクトへのポインターを指定すると、その目標は、基礎となる Derived オブジェクトの動的に割り当てられたコピーを作成し、「一時オブジェクトのアドレスを返す」などの問題を回避することです。
伝統的に、これは一連の作業を通じて解決されてきました。条件ステートメント内の typeid またはdynamic_casts。しかし、私たちはより洗練された解決策を模索しています。
Virtual Clone メソッド
鍵となるのは、派生ごとに実装された仮想 clone() メソッドを Base クラスに導入することです。タイプ。このメソッドはオブジェクトのコピーを返します。 Base が抽象でない場合は、そのコピー コンストラクターを呼び出すことができますが、このアプローチには、派生クラスで適切に実装されていない場合にスライスのリスクが伴います。
コード再利用のための CRTP イディオム
コードの重複を避けるために、CRTP (Curiously Recurring Template Pattern) イディオムを使用できます。次の汎用テンプレートを考えてみましょう。
template <class Derived> class DerivationHelper : public Base { public: virtual Base* clone() const { return new Derived(static_cast<const Derived&>(*this)); } };
このテンプレートを利用すると、複数の派生クラスが DerivationHelper から継承し、それぞれのコピー コンストラクターを使用して clone() メソッドを実装できます。
実装と利点
このソリューションにはいくつかの利点があります。
virtual clone() メソッドと CRTP イディオムを採用することで、プログラマは効果的に目的の結果を達成できます。複雑なアプローチやエラーが発生しやすいアプローチを必要とせずに機能を実現できます。
以上が多態性基本クラス ポインターから派生クラス インスタンスのコピーを作成する方法: 仮想クローン メソッドと CRTP を使用したソリューションの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。