向量容器中的物件切片和多態性
在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中文網其他相關文章!