2013-02-18 5 views
3

이 인쇄물이 출력되는 이유는 23입니다. 내 기대는 33이었다. 누군가는 이것에 대해 약간의 빛을 비춰 줄 수 있었습니까?선택적 인수가있는 가상 함수 무시

struct A { 
    virtual void f() {cout << "1";} 
}; 

/* Private inheritance */ 
struct B : private A { 
    void f(int x = 0) {cout << "2";} 
}; 

struct C : B { 
    void f(){cout << "3";} 
}; 

int main() { 
    C obj; 
    B &ref = obj; 
    ref.f(); 
    obj.f(); 
} 
+5

'B :: f (int = 0)'는'A :: f()'의 오버라이드 체인에 없기 때문에; 'A :: f()'또는'C :: f()'와 독립적입니다. 서명은 다릅니다. 컴파일러가 왜 C :: f() 대신 (: A :: f()를 통해)'B :: f (int = 0)'을 선택했는지에 대한 질문이 더 많습니다. ? – WhozCraig

+1

관련 : http://stackoverflow.com/questions/3533589/can-virtual-functions-have-default-parameters – jogojapan

답변

5

B 구조체의 f(int x = 0) 방법 중 하나 AC 구조체의 f() 방법에 서명을 공유하지 않습니다.

+3

+1. 왜냐하면 B :: f (int = 0)과'A :: f() '는 실제로 다르다. 호출 할 수있는 후보는 두 가지가있다. 따라서이 호출은 가상 다형성보다는 ** 과부하 해결 **을 겪습니다. 가장 적합한 피팅 후보가 선택되며이 경우 B :: f (int = 0)입니다. 필요하다면 여행에 대한 정확한 규칙을 찾기 위해 표준을 검색 할 수 있지만 궁극적으로'C :: f()'가 호출되지 않는 근본적인 이유입니다. – WhozCraig

+0

나는 당신이 그것을 링크하면 자신을 포함한 많은 사람들이 그 문서에 관심을 가질 것이라고 확신합니다. – Aesthete

+0

문제가 너무 많지 않으면 관련 표준 견적을 추가하는 것이 좋습니다. – jogojapan