多態性基本クラス ポインターから派生クラス インスタンスをコピーする
多くの人にとって、このプログラミングの難問はとらえどころのないものであることがわかっています。関連する複雑さを調べて、効率的な解決策を見つけてみましょう。
次のシナリオを考えてみましょう。Base、Derived1、Derived2 などのクラスがあり、Derived クラスは Base から継承します。 Base オブジェクトへのポインターを指定すると、その目標は、基になる Derived オブジェクトの動的に割り当てられたコピーを作成し、「一時アドレスの戻り」などの問題を回避することです。
伝統的に、これは一連の作業を通じて対処されてきました。条件ステートメント内の typeid またはdynamic_casts。しかし、私たちはより洗練された解決策を求めています。
仮想クローン メソッド
重要なのは、派生ごとに実装される仮想 clone() メソッドを Base クラスに導入することにあります。タイプ。このメソッドはオブジェクトのコピーを返します。 Base が抽象でない場合は、そのコピー コンストラクターを呼び出すことができますが、このアプローチには、派生クラスで適切に実装されていない場合にスライスのリスクが伴います。
コード再利用のための CRTP イディオム
コードの重複を避けるために、CRTP (Curiously Recurring Template Pattern) イディオムを使用できます。次の汎用テンプレートを考えてみましょう:
templateclass DerivationHelper : public Base { public: virtual Base* clone() const { return new Derived(static_cast (*this)); } };
このテンプレートを利用すると、複数の派生クラスが DerivationHelper から継承し、それぞれのコピー コンストラクターを使用して clone() メソッドを実装できます。
実装と利点
このソリューションにはいくつかの利点があります。
virtual clone() メソッドと CRTP イディオムを採用することで、プログラマは複雑な処理や複雑な処理を必要とせずに、目的の機能を効果的に実現できます。間違いが起こりやすいアプローチ。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3