2011-08-10 2 views
5

이 코드를 감안할 때 :기본 클래스에서 숨겨진 오버로드를 노출하는 방법?

class base { 
public: 
    string foo() const; // Want this to be visible in 'derived' class. 
} 

class derived : public base { 
public: 
    virtual int foo(int) const; // Causes base class foo() to be hidden. 
} 

base class를 호출하는 더미 메소드 오버로딩없이 base :: foo()를 파생시킬 수 있습니까? using가 속임수를 쓰는가? 그렇다면 어디로 간다.

class derived : public base { 
public: 
    virtual int foo(int) const; 
    using base::foo; 
} 

답변

4

유감스럽게도 답변은 있지만 그렇습니다.

derived x; 
string str = x.base::foo(); // works without using 
+0

나는 포인터를 위해 작동한다고 가정한다 : x_ptr-> base :: foo(), 맞습니까? – WilliamKF

+0

@ 윌리엄 : 예. 둘의 차이점은'using'이 그 이름의 모든 멤버를 하나의 범위로 끌어 들이기 때문에 모두가 과부하 해결에 참여한다는 것입니다. – ybungalobill

1

using 지시문이 선택 편리해집니다 방법을 볼 기지에서의 범위에 :

class derived : public base { 
public: 
    virtual int foo(int) const; 
    using base::foo; 
}; 

은 또한 당신도 using하지 않고 기본에 액세스 할 수 있습니다 : 그것은 당신이 원하는 것을 다음과 같이 정확히 및 수행 파생 된. 그러나 디자인 관점에서 보면 공용 인터페이스를 사용하는 동안 파생 된 범위에 이름을 숨기고 있기 때문에 바람직하지 않습니다. (개인 인터페이스로 이것을하는 것이 더 합리적 임)

관련 문제