> 백엔드 개발 > C++ > 다형성 동작을 달성하기 위해 C에서 객체 슬라이싱을 어떻게 피할 수 있습니까?

다형성 동작을 달성하기 위해 C에서 객체 슬라이싱을 어떻게 피할 수 있습니까?

DDD
풀어 주다: 2024-12-26 04:33:10
원래의
427명이 탐색했습니다.

How Can Object Slicing Be Avoided in C   to Achieve Polymorphic Behavior?

객체 슬라이싱 및 다형성 동작

객체 지향 프로그래밍에서 파생 클래스 객체를 기본 클래스 변수에 저장하면 다음과 같은 예기치 않은 동작이 발생할 수 있습니다. 객체 슬라이싱. 이 문제는 기본 클래스 변수에 파생 클래스의 개체가 할당되어 개체 분할로 인해 파생 클래스별 멤버가 손실될 때 발생합니다.

예:

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

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

이 예에서 파생 클래스 개체는 기본 클래스의 벡터에 저장됩니다. 객체 벡터. 그러나 기본 클래스 객체 vect[0]에서 식별() 메서드를 호출하면 예상되는 "DERIVED" 대신 "BASE"가 출력됩니다.

해결책:

객체 슬라이싱을 방지하고 다형성 동작을 달성하기 위한 올바른 접근 방식은 기본 클래스에 대한 포인터를 벡터:

vector<Base*> vect;
로그인 후 복사

포인터를 사용하면 파생된 클래스별 멤버가 보존되어 원하는 다형성 동작이 가능합니다.

스마트 포인터를 사용한 향상된 솔루션:

올바른 메모리 관리를 위해서는 원시 포인터 대신 적합한 스마트 포인터를 사용하는 것이 좋습니다. 포인터:

vector<unique_ptr<Base>> vect;
로그인 후 복사

이렇게 하면 RAII(Resource Acquisition Is Initialization)를 사용하여 기본 클래스 객체의 메모리가 자동으로 관리되므로 코드가 더욱 효율적이고 강력해집니다.

위 내용은 다형성 동작을 달성하기 위해 C에서 객체 슬라이싱을 어떻게 피할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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