계산식이 있어도 어떤 함수가 불렸는지 읽어요
앞 레슨에서는 같은 부모 참조가 실제 정책의 계산을 고르는 것을 읽었어요. 이번에는 자식의 계산식이 맞는데도 부모의 계산이 선택되는 이유를 추적해요. override하려면 이름뿐 아니라 매개변수와 const 조건까지 맞춰야 해요.
함수 뒤 const는 ‘이 호출로 객체의 멤버를 바꾸지 않는 함수’라는 선언이에요. const Pass&는 객체를 바꾸지 않고 읽는 부모 참조이므로 그 참조에서 호출할 fee도 const 함수예요.
호출 계약과 실제 객체를 한 줄씩 연결해요
int readFee(const Pass& pass) { return pass.fee(); }
읽기 함수는 부모 형식의 const 참조로 fee를 호출해요. 실제 객체가 UsagePass여도, 자식이 부모의 fee() const를 재정의해야 자식 계산이 선택돼요. const 없는 fee는 같은 이름의 별도 함수라 그 약속을 대신하지 못해요.
기본료 10, 사용 7회, 무료 3회, 추가 단가 2라면 자식 계산은 18이에요. 부모 함수만 불리면 얼마일까요? 기본료 10만 반환해요. 다음 과제는 요금 계산식을 바꾸기보다 실제 호출되는 함수를 바로잡는 연습이에요.
직접 풀어봐요
사용량 이용권 요금은 base원에 무료 freeCount회를 넘은 사용량에만 회당 unit원을 더해요. count≤freeCount면 기본료만 받아요. 제공 solution이 UsagePass 객체의 요금을 반환하도록 잘못된 한 줄을 수정해요.
base는 01000, count·freeCount는 0100, unit은 0~100이에요. 실행용 입력은 base count freeCount unit, 출력은 반환값이에요. readFee와 main은 제공된 계약대로 유지해요.
예시 1: (10,7,3,2) → 18. 무료 횟수를 넘는 네 회에 8원을 더해요.
예시 2: (20,2,5,4) → 20. 무료 횟수 안이라 기본료 20만 받아요.
예시 입력
10 7 3 2
예상 결과
18
예시 입력
20 2 5 4
예상 결과
20
핵심 개념
oop-inheritance-poly: 제공된 부모 참조 호출과 자식 함수의 시그니처를 맞춰요.