> 백엔드 개발 > C++ > C 벡터와 함께 상속을 사용할 때 객체 슬라이싱을 어떻게 방지할 수 있습니까?

C 벡터와 함께 상속을 사용할 때 객체 슬라이싱을 어떻게 방지할 수 있습니까?

Susan Sarandon
풀어 주다: 2024-12-16 16:16:12
원래의
798명이 탐색했습니다.

How Can I Avoid Object Slicing When Using Inheritance with C   Vectors?

벡터 컨테이너의 객체 슬라이싱 및 다형성

C에서 상속을 처리할 때 파생 클래스의 인스턴스를 컨테이너에 저장하는 것이 바람직한 경우가 있습니다. 벡터와 같은. 그러나 벡터를 사용하여 기본 클래스 객체를 저장하는 간단한 접근 방식은 파생된 클래스별 데이터가 손실되는 객체 슬라이싱으로 이어질 수 있습니다.

다음 프로그램을 고려하세요.

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;
}
로그인 후 복사

코드는 Base 객체의 벡터를 생성하고 Derived 클래스의 인스턴스를 저장합니다. 그러나 저장된 객체에 대해identify() 메서드를 호출하면 "DERIVED" 대신 "BASE"가 인쇄됩니다. 이는 파생 객체가 기본 벡터 요소에 할당될 때 객체 슬라이싱이 발생하여 파생된 특정 데이터가 손실되기 때문입니다.

객체 슬라이싱을 방지하고 다형성 동작을 보존하기 위해 선호되는 솔루션은 포인터를 사용하는 것입니다. 벡터의 기본 클래스 객체에:

vector<Base*>
로그인 후 복사

이렇게 하면 파생된 클래스별 데이터가 그대로 유지됩니다. 또한 수동 메모리 관리를 피하기 위해 스마트 포인터를 사용할 수 있습니다.

vector<std::shared_ptr<Base>>
로그인 후 복사

스마트 포인터는 RAII(Resource Acquisition Is 초기화)를 통해 자동 메모리 관리를 보장하여 더욱 강력하고 C 호환 접근 방식을 만듭니다.

위 내용은 C 벡터와 함께 상속을 사용할 때 객체 슬라이싱을 어떻게 방지할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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