C++中的對(duì)象切片(Object Slicing)是指在多態(tài)過(guò)程中,派生類(lèi)對(duì)象被當(dāng)作基類(lèi)對(duì)象使用時(shí),派生類(lèi)的成員變量會(huì)被切掉,只剩下基類(lèi)的成員變量
對(duì)象切片在多態(tài)中的表現(xiàn)主要體現(xiàn)為丟失了派生類(lèi)的特性。當(dāng)一個(gè)派生類(lèi)對(duì)象被當(dāng)作基類(lèi)對(duì)象使用時(shí),它的動(dòng)態(tài)類(lèi)型變?yōu)榛?lèi),因此只能訪(fǎng)問(wèn)基類(lèi)的成員函數(shù)和成員變量。如果派生類(lèi)重寫(xiě)了基類(lèi)的虛函數(shù),那么這些重寫(xiě)的函數(shù)在基類(lèi)對(duì)象中將不會(huì)被調(diào)用,而是調(diào)用基類(lèi)的原始版本。這可能導(dǎo)致程序行為不符合預(yù)期,因?yàn)榛?lèi)版本的函數(shù)可能無(wú)法充分利用派生類(lèi)的特性。
為了避免對(duì)象切片,可以使用指針或引用來(lái)操作多態(tài)對(duì)象。這樣,即使對(duì)象被當(dāng)作基類(lèi)對(duì)象使用,實(shí)際上仍然可以通過(guò)指針或引用訪(fǎng)問(wèn)到派生類(lèi)的成員函數(shù)和成員變量。例如:
#include <iostream>
class Base {
public:
virtual void print() const {
std::cout << "Base class" << std::endl;
}
};
class Derived : public Base {
public:
void print() const override {
std::cout << "Derived class" << std::endl;
}
};
int main() {
Derived d;
Base* b = &d; // 使用指針避免對(duì)象切片
b->print(); // 輸出 "Derived class"
return 0;
}
在這個(gè)例子中,我們使用基類(lèi)指針b
指向派生類(lèi)對(duì)象d
,然后通過(guò)b
調(diào)用print()
函數(shù)。由于沒(méi)有發(fā)生對(duì)象切片,因此輸出了派生類(lèi)的版本。