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

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

Patricia Arquette
풀어 주다: 2024-12-23 19:49:14
원래의
463명이 탐색했습니다.

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿