ホームページ  >  記事  >  バックエンド開発  >  多態性基本クラス ポインターから派生クラス インスタンスを作成する方法: クローン メソッドと CRTP イディオムのガイド

多態性基本クラス ポインターから派生クラス インスタンスを作成する方法: クローン メソッドと CRTP イディオムのガイド

Susan Sarandon
Susan Sarandonオリジナル
2024-10-27 00:21:30126ブラウズ

How to Create Derived Class Instances from a Polymorphic Base Class Pointer:  A Guide to Clone Methods and the CRTP Idiom

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

この問題は、派生クラス インスタンスのコピーを作成しようとすると発生します。多態性基本クラスへのポインターから。単純なアプローチには、多数の型チェックと動的キャストが含まれ、潜在的な派生型をそれぞれチェックして新しい演算子を使用します。ただし、より洗練されたソリューションが利用可能です。

重要なのは、仮想メソッド Base* clone() const = 0; を基本クラスに組み込むことです。各派生クラスはこのメソッドをオーバーライドして、特定のクローンを作成する必要があります。例:

<code class="cpp">class Base {
  virtual ~Base();
  virtual Base* clone() const = 0;
};
class Derived1 : public Base {
  virtual Base* clone() const override { return new Derived1(*this); }
};
class Derived2 : public Base {
  virtual Base* clone() const override { return new Derived2(*this); }
};</code>

ベース ポインターで clone() を呼び出すと、特定の派生クラスの新しいインスタンスを取得できます。この合理化されたアプローチにより、型チェックや動的キャストの必要性がなくなり、コードの明瞭さと効率が向上します。

ただし、コードの重複を避けたい場合は、CRTP (Curiously Recurring Template Pattern) イディオムの活用を検討してください。テンプレート クラスは次のように定義できます。

<code class="cpp">template <class Derived>
class DerivationHelper : public Base {
public:
  virtual Base* clone() const override {
    return new Derived(static_cast<const Derived&>(*this));
  }
};

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

このテンプレート クラスは、派生クラスによって継承されると、 clone() メソッドに必要な実装を提供し、各派生クラスで個別にオーバーライドする必要がなくなります。 .

以上が多態性基本クラス ポインターから派生クラス インスタンスを作成する方法: クローン メソッドと CRTP イディオムのガイドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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