ホームページ > バックエンド開発 > C++ > C でオブジェクトのスライスを回避してポリモーフィックな動作を実現するにはどうすればよいでしょうか?

C でオブジェクトのスライスを回避してポリモーフィックな動作を実現するにはどうすればよいでしょうか?

DDD
リリース: 2024-12-26 04:33:10
オリジナル
430 人が閲覧しました

How Can Object Slicing Be Avoided in C   to Achieve Polymorphic Behavior?

オブジェクトのスライスとポリモーフィックな動作

オブジェクト指向プログラミングでは、派生クラスのオブジェクトを基本クラス変数に格納すると、次のような予期しない動作が発生する可能性があります。オブジェクトのスライス。この問題は、基本クラス変数に派生クラスのオブジェクトが割り当てられ、オブジェクトのスライスにより派生クラス固有のメンバーが失われる場合に発生します。

例:

次のプログラムを考えてみましょう:

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

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