C++对象切片(Object Slicing)是一个概念,指的是当派生类对象被赋值给基类对象时,只会复制基类部分的成员变量,派生类特有的成员变量将被丢弃。这可能导致数据丢失或不正确的行为。这种情况通常发生在使用值传递或赋值操作时,而不是使用指针或引用。
为了避免对象切片,通常建议使用指针或引用来处理多态性,这样可以确保使用派生类的全部功能。
#include <iostream>
using namespace std;class Base {
public:int baseValue;Base(int value) : baseValue(value) {}virtual void display() {cout << "Base value: " << baseValue << endl;}
};class Derived : public Base {
public:int derivedValue;Derived(int base, int derived) : Base(base), derivedValue(derived) {}void display() override {cout << "Base value: " << baseValue << ", Derived value: " << derivedValue << endl;}
};int main() {Derived derivedObj(10, 20);Base baseObj = derivedObj; // 对象切片发生在这里baseObj.display(); // 输出 "Base value: 10",派生类的附加信息丢失了//引用还是指针可以访问到Derived对象的完整内容,而不会发生对象切片。Base& baseRef = derivedObj;// 或者 Base* basePtr = &derivedObj;baseRef.display();return 0;
}