2012-09-06 8 views
0

상속 및 템플릿 메서드에 대한 질문이 있습니다. 내가 컴파일러는 파생 :: 인쇄 (표준 : : 문자열 &) '' '에 대한 호출에 일치하는 기능을' '나에게 알려줍니다템플릿 메서드의 상속

class Base 
{ 
public: 
    template<typename T> 
    void print(const T& s) {std::cout << "Base (templated) prints " << s << "\n";} 
    virtual void print(int i) {std::cout << "Base prints " << i << "\n";} 
}; 

class Derived : public Base 
{ 
public: 
    void print(int i) {std::cout << "Derived prints " << i << "\n";} 
} 

int main() 
{ 
    Derived d; 
    d.print(3);  // works fine 
    std::string s = "hi"; 
    d.print(s); // does not compile 
    return 0; 
} 

이 두 개의 클래스가 있다고 가정. 그러나 Derived에서 Base를 상속받은 경우 템플릿 메서드 print (..)에 대한 호출도 허용해야합니다. 아니요?

필자가 파생 클래스에서 "print"메서드를 정의하지 않으면 모든 것이 잘 작동하고 컴파일러에서 기본 클래스 템플릿 메서드를 호출합니다. 나는 기본 클래스 중 하나를 호출하는 파생 클래스, 또한 템플릿 방법을 정의하는 경우

것 또한 잘 작동,하지만 ... 나에게 당신의 도움에 대한

감사를 마우스 오른쪽 보이지 않는다.

+0

좋아요, 내가 수정하지 않은 몇 가지 특별한 이유가 있습니다. 질문을 단순화하려고했지만 가상 기능과 같은 중요한 세부 사항을 생략했을 수도 있습니다. – bartgol

답변

2

파생 클래스에서 함수를 선언하면 기본 클래스에 같은 이름의 함수가 숨겨집니다. 다음과 같이 선언문을 사용하여 숨기기를 해제 할 수 있습니다.

class Derived : public Base 
{ 
public: 
    // Add this 
    using Base::print; 

    void print(int i) {std::cout << "Derived prints " << i << "\n";} 
} 
+0

고마워요! 웬일인지 나는 두 개 중 하나가 템플리트 화 된 것이고 다른 하나는 그렇지 않은 것이므로 동일한 것으로 간주되지 않았을 것이라고 생각했다. 또한 Base 클래스에는 유도 된 파생 클래스를 서명과 완벽하게 일치시키는 메서드 (템플릿 화되지 않은 메서드)가 있기 때문입니다. 그래서 저는 파생 된 사람이 그 하나만을 숨겼습니다. (나는베이스 클라세 스에 템플릿이없는 버전도 포함하도록 질문을 편집했습니다). – bartgol

1

이것은 기본 기본 이름 숨김이며 기본 클래스 함수가 ​​템플릿이라는 사실과 전혀 관련이 없습니다. 예수님의 재림이 될 수 있었으며 컴파일러는 여전히 그것을 숨길 수있었습니다. 파생 클래스를 기본 클래스의 예상치 못한 변경으로부터 보호하고 보호하기 위해 구현되는 정상적인 동작입니다.

+0

감사합니다. 어떤 이유로 템플릿 메서드를 숨길 수는 없지만 ... 나는 단지 그것이 다른 것이라고 생각했습니다 ... – bartgol