@ 16. 1 ~ 17. 1/C++

메서드 오버라이딩의 특수한 경우들(2)

namoeye 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++에서 상속되지 않는다.

그래서 디폴트 인자값이 있는 메서드를 오버라이딩할 때는 항상 같은 값으로 디폴트 인자를 정의해 주는 것이 바람직하다.