物件切片和多態性行為
在物件導向程式設計中,將衍生類別物件儲存在基底類別變數中可能會導致意外行為,稱為物件切片。當基類變數被指派派生類別的物件時,會出現此問題,導致派生類別特定的成員因物件切片而遺失。
範例:
考慮以下程序:
#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; }
在這個例子中,衍生類別物件匯出儲存在基底類別的向量中物件向量。然而,當呼叫基類物件 vect[0] 上的 recognize() 方法時,它輸出「BASE」而不是預期的「DERIVED」。
解決方案:
為了防止物件切片並實現多態性行為,正確的做法是在向量:
vector<Base*> vect;
透過使用指針,保留衍生類別特定的成員,從而允許所需的多態行為。
使用智慧指標的增強解決方案:
為了確保正確的記憶體管理,建議使用適當的智慧指標而不是原始指標指標:
vector<unique_ptr<Base>> vect;
這確保了使用資源獲取即初始化(RAII)自動管理基類物件的內存,使程式碼更加高效和強壯。
以上是C 語言中如何避免物件切片來實現多型行為?的詳細內容。更多資訊請關注PHP中文網其他相關文章!