-
항목 37 : 어떤 함수에 대해서도 상속받은 기본 매개변수 값은 절대로 변경금지@ 16. 1 ~ 17. 1/Effective C++ 2015. 1. 25. 23:56
동적타입이란
이 객체가 어떻게 동작할 것이냐를 가리키는 타입이 동적 타입이다.
기본 클래스 *ptr1
기본 클래스 *ptr2=new 파생클래스 1
기본 클래스 *ptr3=new 파생클래스 2
ptr2의 동적 타입은 파생클래스 1 ptr3의 동적 타입은 파생클래스 2
ptr1의 경우에는 동적 타입이 없다.
동적 타입은 프로그램이 실행되는 도중에 바뀔 수 있다.
근데 위에서 ptr1,ptr2,ptr3은 기본클래스에 대한 포인터로 선언되어 있기 때문에 각각의 정적 타입도 모두 기본클래스 타입이다.
가상함수는 동적으로 바인딩된다. 이 뜻은 가상함수의 호출이 일어난 객체의 동적 타입에 따라 어떤 함수가 호출될지를 결정된다는 뜼..
근데 기본 매개변수 값이 설정된 가상함수에서 가상함수는 동적이지만 기본매개변수는 정적이다.
결론
파생클래스에 정의된 가상 함수를 호출하면서 기본 클래스에 정의된 기본 매개변수 값을 사용해 버릴 수 있다는 이야기
위의 예를 들어 ptr2의 정적 타입은 기본클래스이기 때문에 호출 되는 가상함수에 쓰이는 기본 매개변수 값을 기본클래스에서 가져온다.(파생클래스 1일것 같은데..아니라는 것)
근데 ptr1,ptr2,ptr3가 포인터라 그래..(만약 위에서 정적타입을 기본클래스가 아니라 파생클래스로 한다면 기본매개변수는 파생클래스것으로 적용된다, 파생클래스 *ptr1=new 파생클래스)
만약 일반 객체 인스턴스라면 기본매개변수가 파생클래스것으로 적용된다.
참조자도 마찬가지..
그럼 어떻게 해결하는가?
지난번 35항에서 확인한 비가상 인터페이스를 활용한다.NVI
1. 가상함수를 private로 하고 가상함수(매개변수) //기본매개변수가 없다.
2. 기본클래스에서 비가상함수를 만들고 안에 이때 받는 매개변수를 기본매개변수를 설정해서 가상함수에 넘긴다.
비가상 함수(기본매개변수 a)
{
가상함수전 할짓
가상함수(a)
가상함수 끝나고 할짓
}
이런식으로 만든다. 물론 할짓들은 없어도되고 단순히 이 비가상함수가 가상함수를 대신 실행시켜준다는것..
3. 비가상함수는 파생클래스에서 재정의, 오버라이드 하면 안되기 때문에 가능하다.
4. 파생클래스에서는
기본클래스의 가상함수에서 기본매개변수가 없으므로 자유롭게 재정의할 수가 있다.
(물론 기본클래스의 비가상함수에서 기본매개변수가 전달됨 동일한 a로)
'@ 16. 1 ~ 17. 1 > Effective C++' 카테고리의 다른 글
const 멤버 함수의 종류, const 함수내에서 수정가능한 경우 (0) 2015.12.04 #define cosnt 상수변수로 바꾸기! operator[], const static, 클래스내 const, define 매크로 (0) 2015.12.03 항목 36 : 상속받은 비가상 함수를 파생클래스에서 재정의하지말것 (1) 2015.01.25 항목 35 : 가상 함수 대신 쓸 것들도 생각해 두는 자세를 .. (0) 2015.01.25 항목 10 : 대입 연산자는 *this의 참조자를 반환한다 (0) 2015.01.15