-
메서드 오버라이딩의 특수한 경우들(2)@ 16. 1 ~ 17. 1/C++ 2014. 3. 4. 22:43
부모클래스의 메서드가 디폴트 인자 값을 가진 경우
부모클래스와 자식클래스는 각자 서로 다른 디폴트 인자 값을 가질 수 있다.
어느 디폴트 인자가 이용될지는 어느 클래스 타입을 이용했느냐에 의해 결정된다.
class Super { public: virtual void go(int i=2){ cout << "Super" << i << endl; } }; class Sub : public Super { public: virtual void go(int i=7){ cout << "Sub" << i << endl; } }; int main() { Super mySuper; Sub mySub; Super& mySuperRf=mySub; mySuper.go(); mySub.go(); mySuperRf.go(); getch(); return 0; }
결과는
Super 2
Sub 7
Sub 2
Sub객체를 Super타입 포인터 또는 참조로 접근하여 호출하면 go()의 바디는 Sub의 것이 실행되지만
디폴트 인자는 Super에서 정의한 2가 적용된다.
이유는 C++에서 디폴트 인자 값을 결정할 때 실제 이용된 객체는 보지않고 코드에서 표현된 타입만 보기때문이다.(반대라는것)
이 때문에 디폴트 인자 값을 C++에서 상속되지 않는다.
그래서 디폴트 인자값이 있는 메서드를 오버라이딩할 때는 항상 같은 값으로 디폴트 인자를 정의해 주는 것이 바람직하다.
'@ 16. 1 ~ 17. 1 > C++' 카테고리의 다른 글
typedef (0) 2014.03.06 참조형 리턴 타입 / const 키워드 (0) 2014.03.05 메서드 오버라이딩의 특수한 경우들(1) (0) 2014.03.03 ostringstream (0) 2014.03.02 스마트 포인터와 ->, *연산자 오버로딩 (3) 2013.05.21