多態性基本クラスへのポインターから派生クラス インスタンスを作成する
この問題は、派生クラス インスタンスのコピーを作成しようとすると発生します。多態性基本クラスへのポインターから。単純なアプローチには、多数の型チェックと動的キャストが含まれ、潜在的な派生型をそれぞれチェックして新しい演算子を使用します。ただし、より洗練されたソリューションが利用可能です。
重要なのは、仮想メソッド Base* clone() const = 0; を基本クラスに組み込むことです。各派生クラスはこのメソッドをオーバーライドして、特定のクローンを作成する必要があります。例:
<code class="cpp">class Base { virtual ~Base(); virtual Base* clone() const = 0; }; class Derived1 : public Base { virtual Base* clone() const override { return new Derived1(*this); } }; class Derived2 : public Base { virtual Base* clone() const override { return new Derived2(*this); } };</code>
ベース ポインターで clone() を呼び出すと、特定の派生クラスの新しいインスタンスを取得できます。この合理化されたアプローチにより、型チェックや動的キャストの必要性がなくなり、コードの明瞭さと効率が向上します。
ただし、コードの重複を避けたい場合は、CRTP (Curiously Recurring Template Pattern) イディオムの活用を検討してください。テンプレート クラスは次のように定義できます。
<code class="cpp">template <class Derived> class DerivationHelper : public Base { public: virtual Base* clone() const override { return new Derived(static_cast<const Derived&>(*this)); } }; class Derived1 : public DerivationHelper<Derived1> { ... }; class Derived2 : public DerivationHelper<Derived2> { ... };</code>
このテンプレート クラスは、派生クラスによって継承されると、 clone() メソッドに必要な実装を提供し、各派生クラスで個別にオーバーライドする必要がなくなります。 .
以上が多態性基本クラス ポインターから派生クラス インスタンスを作成する方法: クローン メソッドと CRTP イディオムのガイドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。