Vector 可以將衍生類別物件作為基底類別變數嗎?
在 C 中,當嘗試儲存衍生類別的物件時會出現一個令人困惑的問題在其元素屬於基底類別類型的向量中。就像提供的範例中一樣:
#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; }
由於虛擬方法分派,此程式碼不會按預期列印“DERIVED”,而是列印“BASE”。這種異常行為源自於物件切片。
罪魁禍首:物件切片
物件切片是指在下列情況下遺失衍生類別特定資料:將衍生類別的實例儲存在基底類別類型的變數中。這是因為編譯器僅複製物件的共用部分,丟棄派生類別特定的成員。
使用智慧指標的替代方法
克服物件切片並實現多態性行為,最佳實踐是在向量中儲存指向基類物件的指標。這消除了切片,同時保留了衍生類別方法的動態性質。
vector<Base*> vect; vect.push_back(&derived); // Store a pointer to the Derived object
C 方式:使用智慧型指標
為了增強物件導向的方法,建議使用智慧指標而不是原始指標。智慧指標自動處理記憶體管理,確保程式碼安全、乾淨。
#include <memory> vector<unique_ptr<Base>> vect; vect.push_back(make_unique<Derived>());
以上是向量可以在沒有物件切片的情況下保存衍生類別物件嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!