ホームページ > バックエンド開発 > C++ > 基本クラス ポインターから派生クラスをディープ コピーするにはどうすればよいですか?

基本クラス ポインターから派生クラスをディープ コピーするにはどうすればよいですか?

DDD
リリース: 2024-10-25 23:09:28
オリジナル
737 人が閲覧しました

 How to Deep Copy Derived Classes from Base Class Pointers?

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

へのポインターから派生クラス インスタンスのディープ コピーを作成するという課題を考えてみましょう。その多態性基本クラス。 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 サイトの他の関連記事を参照してください。

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