ホームページ  >  記事  >  バックエンド開発  >  C で基本クラス ポインターから派生クラス インスタンスのコピーを作成する方法

C で基本クラス ポインターから派生クラス インスタンスのコピーを作成する方法

Patricia Arquette
Patricia Arquetteオリジナル
2024-10-26 04:55:31359ブラウズ

How to Create Copies of Derived Class Instances from Base Class Pointers in C  ?

ポリモーフィズム: 基本クラス ポインターから派生クラス インスタンスのコピーを作成する

オブジェクト指向プログラミングでは、必要なシナリオがよく発生します。多態性基本クラスへのポインターを介して派生クラス インスタンスにアクセスしながら、派生クラス インスタンスのコピーを作成します。このタスクは、特に外部ライブラリや複雑なコード構造の使用を避ける場合には、困難になる可能性があります。

問題:

次のクラス階層を考えてみましょう:

<code class="cpp">class Base {
  virtual ~Base();
};
class Derived1 : public Base { ... };
class Derived2 : public Base { ... };</code>

目的は、base が指すインスタンスの動的に作成されたコピーを返すメソッド CreateCopy(Base* Base) を作成することです。実行時エラーを防ぐには、一時オブジェクトへの参照を返さないようにすることが重要です。

単純なアプローチ:

単純なアプローチでは、複数の typeid または Dynamic_cast を一連の if ステートメントを使用して特定の派生クラスの型を決定し、new 演算子を使用してコピーを作成します。ただし、このメソッドは面倒でエラーが発生しやすくなります。

より良いアプローチ:

よりエレガントで汎用性の高い解決策は、基本クラスに仮想メソッドを導入することです。

<code class="cpp">class Base {
  virtual ~Base();
  virtual Base* clone() const = 0;
};</code>

各派生クラスは、独自の clone() メソッドを実装して、インスタンスのコピーを作成します。

CRTP (Curiously Recurring Template Pattern):

各派生クラスで clone() 実装の重複を避けるために、テンプレート クラスを通じて CRTP イディオムを活用できます。

<code class="cpp">template <class Derived>
class DerivationHelper : public Base {
public:
  virtual Base* clone() const {
    return new Derived(static_cast<const Derived&>(*this)); // call the copy ctor.
  }
};</code>

派生クラスは、Base から直接ではなく DerivationHelper から継承できるようになりました。 :

<code class="cpp">class Derived1 : public DerivationHelper<Derived1> { ... };
class Derived2 : public DerivationHelper<Derived2> { ... };</code>

このアプローチにより、各クラスに手動で実装する必要がなく、すべての派生クラスが clone() メソッドにアクセスできるようになります。

以上がC で基本クラス ポインターから派生クラス インスタンスのコピーを作成する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。