벡터 컨테이너의 객체 슬라이싱 및 다형성
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!