ホームページ > バックエンド開発 > C++ > ベクトルはオブジェクトをスライスせずに派生クラス オブジェクトを保持できますか?

ベクトルはオブジェクトをスライスせずに派生クラス オブジェクトを保持できますか?

Susan Sarandon
リリース: 2024-12-27 02:27:10
オリジナル
495 人が閲覧しました

Can Vectors Hold Derived Class Objects Without Object Slicing?

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート