乐闻世界logo
搜索文章和话题

What is object slicing?

4 个月前提问
2 个月前修改
浏览次数22

1个答案

1

对象切片是面向对象编程中的一个概念,它发生在一个派生类对象被赋值给一个基类对象时,从而导致派生类对象的部分成员(通常是那些只存在于派生类中的成员)被切掉,只保留了基类中存在的成员。

这个现象通常是由于不适当的使用指针或引用而引起的。在C++中,这通常发生在一个派生类的对象通过值传递给接受基类类型的函数时。由于函数参数是基类类型,所以传递过程中只会复制基类部分的成员变量,派生类特有的成员变量不会被复制。

例子:

假设我们有以下两个类:

cpp
class Base { public: int base_var; }; class Derived : public Base { public: int derived_var; };

如果我们创建一个 Derived 的对象,然后将它赋值给一个 Base 类型的对象,就会发生对象切片:

cpp
Derived derivedObj; derivedObj.base_var = 1; derivedObj.derived_var = 2; Base baseObj = derivedObj; // 对象切片发生在这里

在这个例子中,derivedObj 被赋值给 baseObj 时,derived_var 不会被复制到 baseObj 中,因为 baseObj 作为 Base 类型的对象,只包含 Base 类的成员。

如何避免对象切片?

为了避免对象切片,通常我们会通过指针或引用来传递对象,这样就可以保留对象的完整性,包括其派生类部分:

cpp
Derived derivedObj; Base* basePtr = &derivedObj;

通过使用指针或引用,我们可以确保即使在基类的上下文中,也可以访问到派生类的成员。这种方法避免了对象切片,并允许多态行为的正确表达。

2024年7月10日 11:50 回复

你的答案