객체 슬라이싱 및 다형성 동작
객체 지향 프로그래밍에서 파생 클래스 객체를 기본 클래스 변수에 저장하면 다음과 같은 예기치 않은 동작이 발생할 수 있습니다. 객체 슬라이싱. 이 문제는 기본 클래스 변수에 파생 클래스의 개체가 할당되어 개체 분할로 인해 파생 클래스별 멤버가 손실될 때 발생합니다.
예:
다음 프로그램을 고려해보세요.
#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 중국어 웹사이트의 기타 관련 기사를 참조하세요!