C++對象切片(Object Slicing)是指在將派生類對象賦值給基類對象時(shí),派生類中的成員變量會被切掉,只剩下基類中的成員變量的過程
當(dāng)我們將一個(gè)派生類對象放入一個(gè)容器中時(shí),可能會遇到對象切片的問題。這是因?yàn)楫?dāng)我們從派生類對象中提取一個(gè)基類對象時(shí),派生類的成員變量會被切掉。這可能導(dǎo)致容器中存儲的對象狀態(tài)不完整,從而引發(fā)錯(cuò)誤。
為了避免對象切片問題,我們可以采取以下措施:
使用指針或引用:將派生類對象的指針或引用存儲在容器中,而不是直接存儲對象本身。這樣,我們可以避免對象切片,因?yàn)橹羔樆蛞弥赶虻氖菍?shí)際對象,而不是對象的基類部分。例如,使用std::vector<std::shared_ptr<DerivedClass>>
或std::vector<std::unique_ptr<DerivedClass>>
來存儲派生類對象的智能指針。
使用多態(tài):通過在基類中定義虛函數(shù),并在派生類中重寫這些函數(shù),我們可以實(shí)現(xiàn)多態(tài)。這樣,當(dāng)我們在容器中存儲基類對象并調(diào)用虛函數(shù)時(shí),實(shí)際上會調(diào)用派生類中的函數(shù),從而避免了對象切片問題。例如:
class Base {
public:
virtual void foo() {
// 基類實(shí)現(xiàn)
}
};
class Derived : public Base {
public:
void foo() override {
// 派生類實(shí)現(xiàn)
}
};
std::vector<Base*> container;
container.push_back(new Derived());
container[0]->foo(); // 調(diào)用派生類中的foo函數(shù)
總之,在容器中存儲派生類對象時(shí),要注意避免對象切片問題??梢允褂弥羔樆蛞靡约岸鄳B(tài)來實(shí)現(xiàn)這一目標(biāo)。