2012-03-18 7 views
0

중복 서명 다음 한 코드 :가상 상속의 우리를 가정 해 봅시다

struct A{ 
    virtual ~A(){} 

    void f(){ 
     p = 42; 
    } 

    int p; 
}; 

struct B : public virtual A{}; 
struct C : public virtual A{}; 
struct D : public B, public C, public A{}; //let's add non-virtual inheritance 

int main(){ 
    D* pA = new D(); 
    pA->A::f(); //! 

    return 0; 
} 

은 가장 기본 클래스 A에서 42 페이지를 설정하는 방법은 없나요? 다음의 구조 pA → A :: f(); non-virtual 상속 된 클래스 A에 대해 p를 42로 설정합니다. 캐스트없이 수행 할 수 있습니까?

+0

정확히 무엇입니까? 사실상 상속한다는 것은 A의 한 인스턴스를 얻는다는 것을 의미합니다. –

답변

3

먼저 캐스팅이 없습니다. A의 버전을 둘 이상으로 지정하기 만하면됩니다. 물론, 처음에 모호성을 해결하지 않기 때문에 실제로 선택한 표기법이 작동하지 않습니다. 난 당신이 클래스의 사용자에 호출 할 멤버 함수의 선택의 부담을하지 않으려면

pA->B::f(); 

같은 것을 사용하는 의미 생각, 당신은 D에 적합한 전송 기능을 제공해야합니다 예 :

void D::f() { this->B::f(); } 
+0

방금 ​​pA-> B :: A :: f();를 호출 할 수 있다는 것을 깨달았습니다. :) 그리고 이것은 대부분의 기본 클래스 A의 값을 바꿀 것입니다. – innochenti

+0

'A ::'부분을 생략 할 수 있습니다. 명확하게 기능에 이르는 경로의 시작을 선택하면 추가 자격이 필요하지 않습니다. 글쎄, 기능이 가상하지 않는 한 당신은 기본 버전 전화를하고 싶습니다. –

관련 문제