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()
函数。由于没有发生对象切片,因此输出了派生类的版本。