Dynamic Dispatch

다형성 유지 조건

가상 함수 호출은 실제 객체 타입을 따라가지만, 객체를 값으로 복사하면 파생 부분이 잘려 다형성이 사라질 수 있습니다.

호출 경로기반 포인터나 참조를 통해 virtual 함수를 호출합니다.
삭제 경로기반 포인터로 지울 수 있다면 기반 소멸자를 virtual로 둡니다.
reference

참조와 포인터로 받습니다

Shape& 또는 Shape*는 실제 객체의 파생 부분을 보존합니다.

virtual

동적 바인딩을 켭니다

기반 클래스 함수에 virtual이 있어야 런타임 타입의 재정의가 선택됩니다.

override

함수 서명을 고정합니다

파생 클래스의 override는 잘못된 매개변수나 const 누락을 드러냅니다.

안전한 전달draw(const Shape& s)처럼 기반 참조로 받습니다.
위험한 전달draw(Shape s)처럼 값으로 받으면 파생 상태가 사라집니다.
소유권 전달다형 객체 소유는 std::unique_ptr<Base>처럼 명확히 표현합니다.

실제 타입 다형성 API는 “무엇을 호출할까”보다 “객체의 실제 정체성을 어떻게 보존할까”가 먼저입니다.