다형성의 객체 슬라이싱: 파생 클래스 객체를 기본 클래스 변수에 저장
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!