ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 메서드 오버라이딩의 특수한 경우들(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
Designed by Tistory.