首頁 >後端開發 >C++ >物件切片如何影響 C 中的多態性?

物件切片如何影響 C 中的多態性?

Susan Sarandon
Susan Sarandon原創
2024-12-17 11:20:27409瀏覽

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”。這是因為派生物件在儲存在 vect 向量中時被切片,該向量被宣告為保存基底物件。

要解決此問題並保持多態行為,必須在向量中儲存指向基底類別的指標而不是物件本身:

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

vect[0]->identify();

現在,vect[0] 指向Derived 對象,確保派生類別的identify()方法被呼叫並列印“DERIVED”。

為了進一步增強這種方法並避免手動記憶體管理,可以使用智慧指標。例如:

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

vect[0]->identify();

這種方法可以確保自動管理 Derived 物件的內存,從而使程式碼更加有效率且不易出錯。

以上是物件切片如何影響 C 中的多態性?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn