>백엔드 개발 >C++ >객체 슬라이싱이 C의 다형성에 어떤 영향을 미칩니까?

객체 슬라이싱이 C의 다형성에 어떤 영향을 미칩니까?

Susan Sarandon
Susan Sarandon원래의
2024-12-17 11:20:27455검색

How Does Object Slicing Affect Polymorphism in C  ?

다형성의 객체 슬라이싱: 파생 클래스 객체를 기본 클래스 변수에 저장

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;
}

여기서 코드에서는 가상 메소드이기 때문에 식별() 메소드가 "DERIVED"를 인쇄할 것으로 예상합니다. 그러나 대신 "BASE"를 인쇄합니다. 이는 파생 객체가 기본 객체를 보유하도록 선언된 vect 벡터에 저장될 때 슬라이스되기 때문입니다.

이 문제를 해결하고 다형성 동작을 유지하려면 벡터에 기본 클래스에 대한 포인터를 저장해야 합니다. 객체 자체 대신:

vector<Base*> vect;
vect.push_back(&derived);

vect[0]->identify();

이제 vect[0]은 파생 객체를 가리키며 파생 클래스의 식별() 메서드가 호출되고 인쇄되도록 합니다. "DERIVED".

이 접근 방식을 더욱 향상시키고 수동 메모리 관리를 방지하려면 스마트 포인터를 사용할 수 있습니다. 예를 들면 다음과 같습니다.

vector<unique_ptr<Base>> vect;
vect.push_back(make_unique<Derived>());

vect[0]->identify();

이 접근 방식을 사용하면 파생 개체에 대한 메모리가 자동으로 관리되므로 코드가 더 효율적이고 오류가 발생할 가능성이 줄어듭니다.

위 내용은 객체 슬라이싱이 C의 다형성에 어떤 영향을 미칩니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.