首页 >后端开发 >C++ >在基类向量中存储派生类对象时如何避免对象切片?

在基类向量中存储派生类对象时如何避免对象切片?

Patricia Arquette
Patricia Arquette原创
2024-12-23 19:49:14427浏览

How Can Object Slicing Be Avoided When Storing Derived Class Objects in Base Class Vectors?

派生类存储中的对象切片

将派生类的对象存储在为基类设计的向量中时,可能会遇到意外的行为。原因在于对象切片,其中派生类特定的成员被截断。

示例:

#include <vector>
using namespace std;

class Base { public: virtual void identify() { cout << "BASE" << endl; } };
class Derived : public Base { public: virtual void identify() { cout << "DERIVED" << endl; } };

int main() {
  Derived derived;
  vector<Base> vect;
  vect.push_back(derived); // Object slicing occurs here
  vect[0].identify(); // Unexpectedly prints "BASE"
  return 0;
}

解决方案:使用 Smart 存储基类指针指针

为了避免对象切片,请将指针存储到基址向量中的类对象。具体来说,使用智能指针来有效地管理内存:

// Include smart pointer library
#include <memory>

// Replace raw pointers with smart pointers
vector<shared_ptr<Base>> vect;

int main() {
  Derived derived;
  vect.push_back(make_shared<Derived>(derived));
  vect[0]->identify(); // Properly prints "DERIVED"
  return 0;
}

通过使用智能指针,您可以保持派生对象的多态性,同时无缝管理内存,无需手动操作指针。

以上是在基类向量中存储派生类对象时如何避免对象切片?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn