벡터가 파생 클래스 개체를 기본 클래스 변수로 보유할 수 있습니까?
C에서 파생 클래스의 개체를 저장하려고 할 때 당황스러운 문제가 발생합니다. 요소가 기본 클래스 유형인 벡터에서. 제공된 예와 같이:
#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; }
가상 메서드 디스패치로 인해 예상대로 "DERIVED"를 인쇄하는 대신 이 코드는 "BASE"를 인쇄합니다. 이러한 비정상적인 동작은 객체 슬라이싱에서 비롯됩니다.
범인: 객체 슬라이싱
객체 슬라이싱은 다음과 같은 경우 파생된 클래스별 데이터가 손실되는 것을 의미합니다. 기본 클래스 유형의 변수에 파생 클래스의 인스턴스를 저장합니다. 이는 컴파일러가 객체의 공유 부분만 복사하고 파생된 클래스별 멤버를 삭제하기 때문입니다.
스마트 포인터를 사용한 대체 방법
객체 슬라이싱을 극복하려면 다형성 동작을 달성하려면 가장 좋은 방법은 기본 클래스 객체에 대한 포인터를 벡터에 저장하는 것입니다. 이는 파생 클래스 메서드의 동적 특성을 유지하면서 슬라이싱을 제거합니다.
vector<Base*> vect; vect.push_back(&derived); // Store a pointer to the Derived object
C 방식: 스마트 포인터 사용
객체 지향 접근 방식을 향상하려면, 원시 포인터 대신 스마트 포인터를 사용하는 것이 좋습니다. 스마트 포인터는 메모리 관리를 자동으로 처리하여 안전하고 깔끔한 코드를 보장합니다.
#include <memory> vector<unique_ptr<Base>> vect; vect.push_back(make_unique<Derived>());
위 내용은 객체 분할 없이 벡터가 파생 클래스 객체를 보유할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!