virtual dispatch

다형성은 기반 타입 이름으로 파생 동작을 호출하게 한다

draw(), Base&, Base*, virtual, delete의 조합은 정적 바인딩과 동적 바인딩의 차이를 보여 줍니다.

Base&

참조 전달과 slicing

함수 매개변수에서 다형성을 쓸 때 안전한 선택입니다.

Base*

포인터 소유권

삭제가 필요하면 가상 소멸자를 반드시 고려합니다.

virtual

실행 시 실제 객체 타입의 함수를 선택하게 만듭니다

기반 클래스 인터페이스가 다형 호출의 출발점이 됩니다.

슬라이싱

객체 슬라이싱

컨테이너나 매개변수에서 값 전달을 쓰면 의도한 draw()가 사라질 수 있습니다.

정적 바인딩 컴파일 시 선택되는 함수는 빠르지만 파생 동작으로 바뀌지 않습니다.
동적 바인딩 virtual 호출은 기반 참조 뒤의 실제 객체 타입에 맞는 override를 실행합니다.
가상 소멸자 기반 포인터로 delete할 가능성이 있으면 소멸자도 virtual이어야 합니다.