C++ 다형성

virtual dispatch 원리

다형성은 같은 호출 문장이 실행 시점 객체에 따라 다른 구현으로 가는 구조다. 포인터·참조로 호출하는지, 함수가 virtual인지, override 서명이 정확한지가 핵심이다.

01

호출 형태

값으로 복사하면 slicing이 생기므로 base pointer/reference 호출인지 확인한다.

값 전달 점검
02

virtual 확인

base 함수가 virtual이어야 실행 시점 타입 기준으로 디스패치된다.

정적 바인딩과 차이
03

서명 검증

const, ref-qualifier, noexcept까지 맞지 않으면 overload가 될 수 있다.

override 사용
04

수명 관리

다형 객체는 unique_ptr<Base>처럼 소유권과 virtual destructor를 함께 설계한다.

삭제 안전성
slicing
파생 부분 손실 Derived를 Base 값으로 복사하면 virtual 호출 이전에 객체 정보가 잘린다.
참조/포인터 사용
override
재정의 실패를 컴파일 오류로 함수 서명이 어긋나면 새 함수가 아니라 오류로 잡힌다.
항상 붙이기
final
재정의 금지 성능보다 의미상 더 이상 바뀌면 안 되는 지점을 표시한다.
계약 고정
pure virtual
인터페이스 강제 구현을 파생 클래스에 맡기지만 소멸자는 정의가 필요할 수 있다.
abstract class

base 값 전달 · virtual dtor · 오버로드 착각 점검

base 값 전달 함수 인자가 Base이면 slicing이 발생하므로 const Base&가 필요한지 본다.
virtual dtor Base 포인터 삭제가 가능한 설계라면 소멸자 virtual 여부를 확인한다.
오버로드 착각 override 누락 함수가 실제로 재정의인지 컴파일러가 검증하게 한다.