반응형
항목 37 : 어떤 함수에 대해서도 상속받은 기본 매개변수 값은 절대로 재정의하지 말자
C++에서 상속받을 수 있는 함수의 종류는 가상 함수와 비가상 함수 두 가지 입니다. 이들 중 비가상 함수는 언제라도 재정의해서는 안 되는 함수입니다.
객체의 정적 타입은 프로그램 소스 안에 여러분이 놓는 선언문을 통해 그 객체가 갖는 타입입니다.
객체의 동적 타입은 현재 그 객체가 진짜로 무엇이냐에 따라 결정되는 타입입니다. 다시 말해, '이 객체가 어떻게 동작할 것이냐'를 가리키는 타입이 동적 타입이라 하겠습니다.
동적 타입은 프로그램이 실행되는 도중에 바뀔 수 있습니다. 대개 대입문을 통해 바뀌죠.
가상 함수는 동적으로 바인딩됩니다. (가상 함수의) 호출이 일어난 객체의 동적 타입에 따라 어떤 (가상) 함수가 호출될지가 결정된다는 뜻입니다.
그런데 '기본 매개변수 값이 설정된' 가상 함수로 오게 되면 뭔가 이상해지기 시작합니다. 가상 함수는 동적으로 바인딩되어 있지만 기본 매개변수는 정적으로 바인딩되어 있기 때문입니다. 그러니까, 파생 클래스에 정의된 가상 함수를 호출함ㄴ서 기본 클래스에 정의된 기본 매개변수 값을 사용해 버릴 수 있다는 이야기입니다.
꼭 잊지 말아야 할 것!
상속받은 기본 매개변수 값은 절대로 재정의해서는 안 됩니다. 왜냐하면 기본 매개변수 값은 정적으로 바인딩되는 반면, 가상함수는 동적으로 바인딩되기 때문입니다.
반응형
'언어 > C++' 카테고리의 다른 글
[Effective C++] private 상속은 심사숙고해서 구사하자 (0) | 2020.02.08 |
---|---|
[Effective C++] "has-a(...는...를 가짐)" 혹은 "is-implemented-in-terms-of(...는...를 써서 구현됨)"를 모형화할 때는 객체 합성을 사용하자 (0) | 2020.02.07 |
[Effective C++] 상속받은 비가상 함수를 파생 클래스에서 재정의하는 것은 절대 금물! (0) | 2020.02.05 |
[Effective C++] 가상 함수 대신 쓸 것들도 생각해 두는 자세를 시시때때로 길러 두자 (0) | 2020.02.04 |
[Effective C++] 인터페이스 상속과 구현 상속의 차이를 제대로 파악하고 구별하자 (0) | 2020.02.03 |