프로그래밍/Effective c++

37. 어떤 함수에 대해서도 상속받은 기본 매개변수 값은 절대로 재정의하지 말자

CuriousBear 2016. 3. 10. 16:41
가상함수는 동적으로 바인딩 되는 반면, 매개변수는 정적으로 바인딩 되기 때문에
기본 클래스와 파생클래스의 매개변수의 기본 지정값이  다르면 파생클래스 객체를 기본클래스 포인터로  받는 경우 기본 클래스의 기본 매개변수로 대입된다.

class A{
public:     
     virtual void f(int i = 0);
}
class B{
public:
    virtual void f(int i = 1);
}

A a = new B;
a.f(); //--> i가 0으로 대입된다.

그래서 이런걸 하려면 private로 가상함수를 빼고 이를 호출하는 새로운  public함수를 만들어서 거기서 매개변수 기본값 설정을 하라는데...

class B{
public:
    void pubf(int i = 1){
          f(i);
     }
private:
     virtual void f(int i);
}

이것도 결국 36의 문제(비가상함수 재정의)에 부닥치게 될 것 같으므로 안쓰는게...