ホームページ >バックエンド開発 >C++ >オブジェクトのスライスは C のポリモーフィズムにどのような影響を与えますか?

オブジェクトのスライスは C のポリモーフィズムにどのような影響を与えますか?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-17 11:20:27429ブラウズ

How Does Object Slicing Affect Polymorphism in C  ?

ポリモーフィズムにおけるオブジェクトのスライス: 派生クラス オブジェクトを基底クラス変数に保存する

C で継承を扱う場合、次の問題が発生する可能性があります。オブジェクトのスライス。これは、派生クラスのオブジェクトが基本クラス変数に割り当てられるときに発生し、派生クラス固有のメンバーが失われます。

次の例を考えてみましょう。

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;
}

この例では、コードでは、identify() メソッドは仮想メソッドであるため、「DERIVED」を出力することが期待されます。ただし、代わりに「BASE」が出力されます。これは、Base オブジェクトを保持するように宣言されている vect ベクトルに格納されるときに、派生オブジェクトがスライスされるためです。

この問題を解決し、ポリモーフィックな動作を維持するには、基本クラスへのポインターをベクトルに格納する必要があります。オブジェクト自体の代わりに:

vector<Base*> vect;
vect.push_back(&derived);

vect[0]->identify();

ここで、vect[0] は派生オブジェクトを指し、派生クラスのidentify() メソッドが呼び出され、出力されるようになります。 "DERIVED".

このアプローチをさらに強化し、手動のメモリ管理を回避するために、スマート ポインターを使用できます。例:

vector<unique_ptr<Base>> vect;
vect.push_back(make_unique<Derived>());

vect[0]->identify();

このアプローチにより、派生オブジェクトのメモリが自動的に管理され、コードがより効率的になり、エラーが発生しにくくなります。

以上がオブジェクトのスライスは C のポリモーフィズムにどのような影響を与えますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。