가상 함수는 호출이 포인터의 정적 타입이 아니라 객체의 동적 타입으로 간다. 베이스가 약속한 동작을 파생이 바꾼다.
호출이 가는 곳
int material(const Piece& piece) {
return piece.value(); // 동적 타입의 value
}`value`가 가상이고 `piece`가 실제로 `Chariot`이면 130이 나온다. 가상이 아니면 베이스 구현이 호출된다. 순수 가상 `= 0`은 베이스에 구현 의무를 두지 않는다. 순수 가상을 가진 클래스는 그 자체로 객체를 만들 수 없는 추상 클래스다.
생성 중의 가상 호출
생성자와 소멸자가 도는 동안 동적 타입은 지금 생성 중인 그 클래스다. 베이스 생성자 안에서 가상 함수를 호출하면 파생 재정의가 아니라 베이스 버전이 호출된다. 파생이 아직 없거나 이미 소멸했기 때문이다. 초기화 순서를 가상 호출에 기대지 않는다.
더 이상 재정의를 막을 때는 `final`을 붙인다. 호출 지점을 컴파일러가 고정할 여지도 생긴다.
댓글
0개아직 댓글이 없습니다.