2013-12-11 6 views
-1

이 항목에 대해 다른 질문을 읽었지만 찾고있는 답변을 꽤 찾지 못했습니다. 실행에가상 메서드 템플릿 클래스에서 다른 가상 메서드를 호출하는 중

class Base { 
public: 
    virtual void foo(int) const {...} 
} 

template <class T> 
class TmplClass : public Base { 
public: 
    virtual void foo(int i) const { foo(T(i)); } 
    virtual void foo(T& param) const { 
     printf("Template::Foo\n"); 
     bar(param); 
    } 
    virtual void bar(T&) const { 
     printf("Template::Bar\n"); 
    } 
} 

class Derived : public TmplClass<SomeConcreteType> { 
public: 
    void bar(SomeConcreteType&) { 
     printf("Derived::Bar\n"); 
    } 
} 

int main() { 
    Derived d; 
    Base* b = &d; 
    b->foo(1); 
} 

내가 얻을 :

Template::Foo 
Template::Bar 

왜 통화 런타임 파견 작업 바하지 않습니다 여기에 내가 가진 코드의 패턴이다? 파생 된에서 foo를 오버로드하면 파생 된 버전의 foo를 호출합니다. 왜 bar에 대한 동적 디스패치를 ​​수행 할 수 없습니까?

기존 코드에서 작업 중이므로 여기에서 클래스의 기본 구조를 변경하지 않는 것이 좋습니다. 전화를 걸 수있는 방법을 찾거나 그렇지 않은 이유를 이해하고 싶습니다. 나는 여기에 다른 질문을 읽는 것에 기초하여 많은 다른 것들을 시도했지만, 아무 소용이 없다.

+0

경우'Derived'의 조상에서'Base'은? –

+0

이것은 실제로 작동하지 않는 예제입니다. 'void foo (void)'메소드가 존재하지 않는데,'Base'는 아무것도의 조상 클래스가 아닙니다. 작업 코드를 입력하십시오. – Jack

+0

이 코드가 컴파일되지 않기 때문에 작동하지 않습니다. [이 비슷한 프로그램] (http://coliru.stacked-crooked.com/a/f97076ef0ad89f1f)은 컴파일을 마치고 ok를 실행합니다. – Casey

답변

1

이것이 템플릿 문제가 아닙니다. 이 코드의 문제점은 TmplClass :: bar 메서드가 const로 표시 될 때 Derived :: bar 메서드가 const로 표시되지 않는다는 것입니다. 따라서 의도적으로 오버 라이드를 제공하는 것이지만 실제로 Derived :: bar는 다른 서명이있는 완전히 다른 방법이므로 기대하지 않은 행동을하는 이유입니다. CONST는 다음 파생 :: 줄 서명이 일치하고 예상 출력 TmplClass :: 줄에서 제거되거나 추가되면 수신 :

Template::Foo 
Derived::Bar 
관련 문제