Home > Backend Development > C++ > How Can Object Slicing Be Avoided When Storing Derived Class Objects in Base Class Vectors?

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

Patricia Arquette
Release: 2024-12-23 19:49:14
Original
479 people have browsed it

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

Object Slicing in Derived Class Storage

When storing objects of derived classes in vectors designed for base classes, one may encounter unexpected behavior. The reason lies in object slicing, where derived class-specific members are truncated.

Example:

#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;
}
Copy after login

Solution: Store Base Class Pointers with Smart Pointers

To avoid object slicing, store pointers to base class objects in the vector. Specifically, use smart pointers to manage memory effectively:

// 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;
}
Copy after login

By using smart pointers, you can maintain the polymorphism of derived objects while seamlessly managing memory without manual pointer manipulation.

The above is the detailed content of How Can Object Slicing Be Avoided When Storing Derived Class Objects in Base Class Vectors?. For more information, please follow other related articles on the PHP Chinese website!

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Latest Articles by Author
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template