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

Susan Sarandon
リリース: 2024-10-27 00:21:30
オリジナル
125 人が閲覧しました

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!