基本クラス ポインターから派生クラスのコピーを作成する
へのポインターから派生クラス インスタンスのディープ コピーを作成するという課題を考えてみましょう。その多態性基本クラス。 if ステートメントで複数の型 ID や動的キャストに依存すると退屈になり、パフォーマンスに影響を与える可能性があるため、これは難しい場合があります。
推奨されるアプローチには、基本クラス内に clone() として知られる仮想メソッドを組み込むことが含まれます。またはコピー()。このメソッドは、派生クラスの新しく作成されたコピーへのポインターを返す必要があります。このメソッドを各派生クラスに実装すると、コピー プロセスが特定の派生クラスの型から独立します。
コードの重複を避けるために、Curiously Recurring Template Pattern (CRTP) イディオムを使用することもできます。テンプレートを使用すると、コピー操作を派生クラスのコンストラクターに委任するヘルパー クラスを作成できます。
Clone() メソッドを使用した実装:
<code class="cpp">class Base { virtual Base* clone() const = 0; }; class Derived1 : public Base { Base* clone() const { return new Derived1(*this); } }; class Derived2 : public Base { Base* clone() const { return new Derived2(*this); } }; Base* CreateCopy(Base* base) { return base->clone(); }</code>
CRTP イディオムを使用した実装:
<code class="cpp">template <class Derived> class DerivationHelper : public Base { public: Base* clone() const { return new Derived(static_cast<Derived&>(*this)); } }; class Derived1 : public DerivationHelper<Derived1> { ... }; class Derived2 : public DerivationHelper<Derived2> { ... };</code>
以上が基本クラス ポインターから派生クラスをディープ コピーするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。