> 백엔드 개발 > C++ > 객체 분할 없이 벡터가 파생 클래스 객체를 보유할 수 있습니까?

객체 분할 없이 벡터가 파생 클래스 객체를 보유할 수 있습니까?

Susan Sarandon
풀어 주다: 2024-12-27 02:27:10
원래의
495명이 탐색했습니다.

Can Vectors Hold Derived Class Objects Without Object Slicing?

벡터가 파생 클래스 개체를 기본 클래스 변수로 보유할 수 있습니까?

C에서 파생 클래스의 개체를 저장하려고 할 때 당황스러운 문제가 발생합니다. 요소가 기본 클래스 유형인 벡터에서. 제공된 예와 같이:

#include <iostream>
#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);
    
    vect[0].identify();
    return 0;
}
로그인 후 복사

가상 메서드 디스패치로 인해 예상대로 "DERIVED"를 인쇄하는 대신 이 코드는 "BASE"를 인쇄합니다. 이러한 비정상적인 동작은 객체 슬라이싱에서 비롯됩니다.

범인: 객체 슬라이싱

객체 슬라이싱은 다음과 같은 경우 파생된 클래스별 데이터가 손실되는 것을 의미합니다. 기본 클래스 유형의 변수에 파생 클래스의 인스턴스를 저장합니다. 이는 컴파일러가 객체의 공유 부분만 복사하고 파생된 클래스별 멤버를 삭제하기 때문입니다.

스마트 포인터를 사용한 대체 방법

객체 슬라이싱을 극복하려면 다형성 동작을 달성하려면 가장 좋은 방법은 기본 클래스 객체에 대한 포인터를 벡터에 저장하는 것입니다. 이는 파생 클래스 메서드의 동적 특성을 유지하면서 슬라이싱을 제거합니다.

vector<Base*> vect;
vect.push_back(&derived); // Store a pointer to the Derived object
로그인 후 복사

C 방식: 스마트 포인터 사용

객체 지향 접근 방식을 향상하려면, 원시 포인터 대신 스마트 포인터를 사용하는 것이 좋습니다. 스마트 포인터는 메모리 관리를 자동으로 처리하여 안전하고 깔끔한 코드를 보장합니다.

#include <memory>

vector<unique_ptr<Base>> vect;
vect.push_back(make_unique<Derived>());
로그인 후 복사

위 내용은 객체 분할 없이 벡터가 파생 클래스 객체를 보유할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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