首頁 > 後端開發 > C++ > 使用 C 向量繼承時如何避免物件切片?

使用 C 向量繼承時如何避免物件切片?

Susan Sarandon
發布: 2024-12-16 16:16:12
原創
800 人瀏覽過

How Can I Avoid Object Slicing When Using Inheritance with C   Vectors?

向量容器中的物件切片和多態性

在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;
}
登入後複製

程式碼建立 Base 物件的向量並儲存 Derived 類別的實例。但是,當對儲存的物件呼叫identify() 方法時,它會列印「BASE」而不是「DERIVED」。這是因為將 Derived 物件指派給 Base 向量元素時會發生物件切片,導致派生特定資料遺失。

為了防止物件切片並保留多態行為,首選解決方案是使用指標向量中的基底類別物件:

vector<Base*>
登入後複製

這確保衍生類別特定資料保持完整。此外,為了避免手動記憶體管理,可以使用智慧指標:

vector<std::shared_ptr<Base>>
登入後複製

智慧指標透過 RAII(資源取得即初始化)確保自動記憶體管理,使其成為更強大且符合 C 的方法。

以上是使用 C 向量繼承時如何避免物件切片?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板