多態中的物件切片:在基底類別變數中儲存衍生類別物件
在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中文網其他相關文章!