>백엔드 개발 >C++ >파생 클래스 객체를 기본 클래스 벡터에 저장할 때 객체 슬라이싱을 어떻게 피할 수 있습니까?

파생 클래스 객체를 기본 클래스 벡터에 저장할 때 객체 슬라이싱을 어떻게 피할 수 있습니까?

Patricia Arquette
Patricia Arquette원래의
2024-12-23 19:49:14459검색

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으로 문의하세요.