多態性基本クラス ポインターから派生クラス インスタンスを作成する
オブジェクト指向プログラミングでは、多くの場合、派生クラスのインスタンスをコピーまたは作成する必要があります。ポインタからポリモーフィック基本クラスへのクラス。ただし、複数の派生型が存在する場合、この操作は困難になる可能性があります。
if ステートメントで複数の typeid または Dynamic_cast を使用して各型をチェックし、次に new を使用する単純なアプローチは、非効率的でエラーが発生しやすくなります。より良い解決策は、基本クラスで仮想メソッドを使用してコピーを作成することです。
Virtual clone() Method
仮想 clone( ) メソッドを基本クラスに追加し、それを各派生クラスに実装することで、派生クラスのインスタンスのコピーを動的に作成することができます。 clone() メソッドは、新しく作成されたコピーへのポインターを返す必要があります。
<code class="cpp">class Base { virtual ~Base(); // Returns a dynamically created copy of this object virtual Base* clone() const = 0; };</code>
<code class="cpp">class Derived1 : public Base { // Implements the clone() method for Derived1 virtual Base* clone() const { return new Derived1(*this); } };</code>
<code class="cpp">class Derived2 : public Base { // Implements the clone() method for Derived2 virtual Base* clone() const { return new Derived2(*this); } };</code>
このアプローチを使用すると、派生クラス インスタンスのコピーを作成できます。以下のように基本クラス ポインターから:
<code class="cpp">Base* basePtr = new Derived1(); Base* copyPtr = basePtr->clone();</code>
ミニマリスト実装のための CRTP イディオム
clone() 各派生クラスで Curiously Recurring Template Pattern (CRTP) イディオムを使用できます。
<code class="cpp">template <class Derived> class DerivationHelper : public Base { public: virtual Base* clone() const { return new Derived(static_cast<const Derived&>(*this)); } };</code>
<code class="cpp">class Derived1 : public DerivationHelper<Derived1> { // Other members... };</code>
<code class="cpp">class Derived2 : public DerivationHelper<Derived2> { // Other members... };</code>
clone() メソッドが自動的に実装されます。各派生クラスで、正しい型に対してコピー コンストラクターが確実に呼び出されるようにします。
以上が多態性基本クラス ポインターから派生クラス インスタンスを作成するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。