다형성은 객체 인스턴스가 아니라 포인터와 참조에서 작동합니다.
이 경우 목록에는 파생 형식이 아닌 car
유형의 개체가 포함되어 있습니다. honda
을 삽입하면 car
부분이 복사되고 나머지 부분은 무시됩니다. 이것은 때로 슬라이스이라고도합니다.
list<car*> cars {new honda};
honda * h_ptr = dynamic_cast<honda*>(cars.back()); // should be a valid pointer
참고 :
다형성를 들어, 포인터의 목록을 사용할 수 있습니다 당신이 내 예제와 같이 new
를 사용하여 할당 할 경우, (같은 std::unique_ptr<car>
) 대신에 하나 delete
그들을 기억, 또는 스마트 포인터를 저장 원시 포인터보다. 기본 클래스 포인터를 사용하여 객체를 삭제하려면 가상 소멸자가 필요합니다.
기본 클래스를 추상화하여 슬라이스 문제를 피할 수 있습니다.; 이 순수 가상 함수를 포함하는 경우, 당신은 그 기능을 오버라이드 (override)에만 파생 된 형식의 해당 유형의 객체 인스턴스화 할 수 없습니다 : 당신이 실제로 추상적 인 인터페이스를하지 않으려면
class car
{
virtual ~car() {}
virtual void do_something() = 0;
};
class honda : public car
{
void do_something() {}
};
(예를 만 액세스하는 경우 가상 함수 대신 dynamic_cast
을 사용하여 파생 클래스 기능을 사용하는 경우) 소멸자를 순수 가상으로 만들 수 있습니다. 파생 클래스는 명시 적으로 아무 것도 재정의 할 필요가 없습니다. 가상 함수를 통해 다형성은 일반적으로 더 효율적이기 때문에, 이것은 다소 특이한 방식이다
class car
{
virtual ~car() = 0;
};
inline car::~car() {}
class honda : public car {};
: 기본 클래스 소멸자는 여전히 구현 클래스 정의 외부에 있어야한다는 인해 언어의 특질에 구현되어야합니다 그리고 더 편리합니다.
정확하게 캐스팅 할 방법이 없습니다. 귀하의 목록은'자동차'목록입니다. 그것은 '혼다 (honda)'를 포함하지 않는다. –