オブジェクトのスライスとポリモーフィックな動作
オブジェクト指向プログラミングでは、派生クラスのオブジェクトを基本クラス変数に格納すると、次のような予期しない動作が発生する可能性があります。オブジェクトのスライス。この問題は、基本クラス変数に派生クラスのオブジェクトが割り当てられ、オブジェクトのスライスにより派生クラス固有のメンバーが失われる場合に発生します。
例:
次のプログラムを考えてみましょう:
#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; }
この例では、派生した派生クラス オブジェクトが基本クラス オブジェクトのベクトルに格納されます。ベクト。ただし、基本クラス オブジェクト vect[0] でidentify() メソッドを呼び出すと、予期される "DERIVED" ではなく "BASE" が出力されます。
解決策:
オブジェクトのスライスを防ぎ、ポリモーフィックな動作を実現するための正しいアプローチは、基本クラスへのポインタをベクトル:
vector<Base*> vect;
ポインターを使用すると、派生クラス固有のメンバーが保持され、目的の多態性動作が可能になります。
スマート ポインターを使用した拡張ソリューション:
適切なメモリ管理を確保するには、生のメモリの代わりに適切なスマート ポインタを使用することをお勧めします。 pointer:
vector<unique_ptr<Base>> vect;
これにより、基本クラス オブジェクトのメモリが Resource Acquisition Is Initialization (RAII) を使用して自動的に管理され、コードがより効率的かつ堅牢になります。
以上がC でオブジェクトのスライスを回避してポリモーフィックな動作を実現するにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。