2013-05-29 5 views
1

다른 서명을 기본 클래스에서 숨겨진 기능에 액세스 t 숨겨진 :우리는이

AB ab; 
ab.f(); // ab.A::f() 
ab.f(1); // ab.B::f(1) 

다음과 같은 코드를 작성하는 것보다이를 달성 할 수있는 간단한 방법이 있나요?

class AB : public A, public B { 
public: 
    //... 
    int f() {return A::f();} 
    int f(int x) {return B::f(x);} 
}; 

은 내가 using 키워드를 생각하지만, 같은 이름의 다른 서명 방법을 구분하지 않습니다.

+0

아니요 - 특정 서명을 지정해야하는 경우 해결책은 담요 대신 사용할 수 있습니다. –

답변

1

유일한 방법은 선언하고 원하는대로 기본 클래스 함수를 호출하는 것입니다.

당신은 몇 가지 이상한 방법으로 사용하는 방법에 대한 생각했을 수도

"using" 예 : using A::f; 그러나 모든 기능 시그니처를 동일하게 상속하고 하나만 지정할 수는 없습니다.

AB 클래스 선언에있는 것입니다 :하는 방법으로 호출 할 때 당신은 당신이 오류가 발생했을 것 모두 기본 클래스에서 인터페이스와 구현을 가지고

바로 상속

  • 두 가지 모두에 공통입니다 (참고! 서명이 동일하지 않더라도). (이 멋진 그렇지? : D)

    Error:"request for member 'f' is ambiguous"

    하지만 theABVar.A::f();와 함께이 문제를 해결 할 수 있습니다 theABVar.A::f(); 당신에게 줄 것이다

    • 같은 이름의 메소드를 추가

      이 모두 기본 클래스에서

    기본 클래스의 멤버가 숨겨져 있으므로 메서드 호출이 더 모호하지 않습니다.
    그러나 기본 클래스의 메서드를 호출하기 전에 이전과 같은 트릭을 수행해야합니다. 당신은 당신은 컴파일 시간에 얻을 것이다 기본 클래스 기능 "을 사용하여"사용하려고하면

    theABVar.f(); 당신이 기능을 사용하지 않는 경우에도, 당신에게

    Ettor: no matching function for call to 'AB::f()'

    • 을 줄 것이다 :

      A :: f를 사용하여; B :: f를 사용하는 ;

    using declaration 'using B::f' conflicts with a previous using declaration

    어떤 방법, 당신이 무엇을하고 있는지에 대해 두 번 생각합니다.
    다른 기본 클래스의 멤버에게 호출되는 인수의 수/유형에 따라 함수가 필요합니까? 그 말이 맞는 많은 상황을 상상할 수 없습니다.

    -------------- 결론 ---------------

    1. 당신이 무엇을하고 있는지에 대해 두 번 생각하십시오. 은폐 방법은 일반적으로 좋지 않습니다. 첫 번째 예를 들어, 클라이언트에서
    2. 가 명시 적으로 전화를 사용할 수 있습니다 theABVar.A::f(), theABVar.A::f(3), theABVar.B::f(), theABVar.B::f(3), theABVar.AB::f(3.0,3.0)theABVar.f(3.0,3.0) (그들은 모두 public 멤버에 액세스 할 수 있습니다).
    3. 원하는대로 원하는 기능을 만들 수 있습니다 (더 간단한 것은 아닙니다).하지만 클라이언트가 여전히 기본 기능을 호출 할 수 있습니다.
관련 문제