이 항목에 대해 다른 질문을 읽었지만 찾고있는 답변을 꽤 찾지 못했습니다. 실행에가상 메서드 템플릿 클래스에서 다른 가상 메서드를 호출하는 중
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에 대한 동적 디스패치를 수행 할 수 없습니까?
기존 코드에서 작업 중이므로 여기에서 클래스의 기본 구조를 변경하지 않는 것이 좋습니다. 전화를 걸 수있는 방법을 찾거나 그렇지 않은 이유를 이해하고 싶습니다. 나는 여기에 다른 질문을 읽는 것에 기초하여 많은 다른 것들을 시도했지만, 아무 소용이 없다.
경우'Derived'의 조상에서'Base'은? –
이것은 실제로 작동하지 않는 예제입니다. 'void foo (void)'메소드가 존재하지 않는데,'Base'는 아무것도의 조상 클래스가 아닙니다. 작업 코드를 입력하십시오. – Jack
이 코드가 컴파일되지 않기 때문에 작동하지 않습니다. [이 비슷한 프로그램] (http://coliru.stacked-crooked.com/a/f97076ef0ad89f1f)은 컴파일을 마치고 ok를 실행합니다. – Casey