기반 타입 값으로 받는 경우
void drawOne(Shape s) { s.draw(); }
Circle을 넘겨도 Shape 부분만 복사되어 Circle의 상태와 재정의 의미가 사라질 수 있습니다.
virtual 함수가 있어도 객체를 기반 클래스 값으로 복사하면 파생 클래스 부분이 사라집니다. 호출 방식과 소유권을 같이 정해야 동적 바인딩이 살아 있습니다.
void drawOne(Shape s) { s.draw(); }
Circle을 넘겨도 Shape 부분만 복사되어 Circle의 상태와 재정의 의미가 사라질 수 있습니다.
void drawOne(const Shape& s) { s.draw(); }
실제 객체의 타입이 유지되어 vtable을 통해 Circle, Rectangle의 구현이 호출됩니다.
다형 객체를 다룰 때는 override 검증, virtual 소멸자, 복사 금지 정책을 함께 확인하면 나중에 생기는 미묘한 런타임 문제를 줄일 수 있습니다.