在面向对象编程中,当通过值传递一个派生类对象时,有时会发生对象切片(object slicing)现象。对象切片是指派生类对象被当作基类对象来处理,导致派生类特有的部分丢失。这种现象通常发生在函数参数按值传递时,因为函数会创建一个基类的副本,而这个副本只能包含基类的成员。
对象切片:当一个派生类对象被赋值给一个基类对象时,只有基类的部分会被复制,派生类特有的部分会被“切掉”。
class Base {
public:
virtual void display() const {
std::cout << "Base class" << std::endl;
}
};
class Derived : public Base {
public:
void display() const override {
std::cout << "Derived class" << std::endl;
}
void newFeature() const {
std::cout << "New feature in Derived class" << std::endl;
}
};
void printObject(const Base& obj) {
obj.display();
}
int main() {
Derived d;
printObject(d); // 调用的是Derived类的display方法
return 0;
}
void printObject(Base* obj) {
obj->display();
}
int main() {
Derived d;
printObject(&d); // 调用的是Derived类的display方法
return 0;
}
原因:当函数参数定义为基类类型并按值传递时,如果传入的是派生类对象,编译器只会复制基类部分,导致派生类特有的成员丢失。
解决方法:
通过这些方法,可以有效防止对象切片现象,确保程序的正确性和效率。
领取专属 10元无门槛券
手把手带您无忧上云