Can Vector Hold Derived Class Objects as Base Class Variables?
C では、派生クラスのオブジェクトを格納しようとすると、複雑な問題が発生します要素が基本クラス型であるベクトル。提供された例のように:
#include <iostream> #include <vector> using namespace std; class Base { public: virtual void identify() { cout << "BASE" << endl; } }; class Derived : public Base { public: virtual void identify() { cout << "DERIVED" << endl; } }; int main() { Derived derived; vector<Base> vect; vect.push_back(derived); vect[0].identify(); return 0; }
仮想メソッドのディスパッチにより期待どおりに「DERIVED」を出力する代わりに、このコードは「BASE」を出力します。この異常な動作は、オブジェクト スライスに起因します。
犯人: オブジェクト スライス
オブジェクト スライスとは、次の場合に派生クラス固有のデータが失われることを指します。派生クラスのインスタンスを基本クラス型の変数に格納します。これは、コンパイラがオブジェクトの共有部分のみをコピーし、派生クラス固有のメンバーを破棄するためです。
スマート ポインターを使用した代替方法
オブジェクトのスライスを克服するには多態性の動作を実現するには、基本クラス オブジェクトへのポインターをベクターに格納するのがベスト プラクティスです。これにより、派生クラス メソッドの動的な性質を維持しながらスライスが排除されます。
vector<Base*> vect; vect.push_back(&derived); // Store a pointer to the Derived object
C の方法: スマート ポインターの使用
オブジェクト指向のアプローチを強化するには、生のポインタの代わりにスマート ポインタを使用することをお勧めします。スマート ポインターはメモリ管理を自動的に処理し、安全でクリーンなコードを保証します。
#include <memory> vector<unique_ptr<Base>> vect; vect.push_back(make_unique<Derived>());
以上がベクトルはオブジェクトをスライスせずに派生クラス オブジェクトを保持できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。