C++中的對象切片(Object Slicing)是指在多態過程中,派生類對象被當作基類對象使用時,派生類的成員變量會被切掉,只剩下基類的成員變量
對象切片在多態中的表現主要體現為丟失了派生類的特性。當一個派生類對象被當作基類對象使用時,它的動態類型變為基類,因此只能訪問基類的成員函數和成員變量。如果派生類重寫了基類的虛函數,那么這些重寫的函數在基類對象中將不會被調用,而是調用基類的原始版本。這可能導致程序行為不符合預期,因為基類版本的函數可能無法充分利用派生類的特性。
為了避免對象切片,可以使用指針或引用來操作多態對象。這樣,即使對象被當作基類對象使用,實際上仍然可以通過指針或引用訪問到派生類的成員函數和成員變量。例如:
#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; // 使用指針避免對象切片
b->print(); // 輸出 "Derived class"
return 0;
}
在這個例子中,我們使用基類指針b
指向派生類對象d
,然后通過b
調用print()
函數。由于沒有發生對象切片,因此輸出了派生類的版本。