多態性基本クラス ポインターから派生クラス インスタンスを作成するにはどうすればよいですか?

DDD
リリース: 2024-10-27 00:09:30
オリジナル
610 人が閲覧しました

 How to Create Derived Class Instances from Polymorphic Base Class Pointers?

多態性基本クラス ポインターから派生クラス インスタンスを作成する

オブジェクト指向プログラミングでは、多くの場合、派生クラスのインスタンスをコピーまたは作成する必要があります。ポインタからポリモーフィック基本クラスへのクラス。ただし、複数の派生型が存在する場合、この操作は困難になる可能性があります。

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート