C++ 调用模板化类中另一个虚拟方法的虚拟方法

C++ 调用模板化类中另一个虚拟方法的虚拟方法,c++,templates,virtual-functions,class-template,C++,Templates,Virtual Functions,Class Template,我一直在阅读关于这个主题的不同问题,但没有找到一个完全符合我所寻找的答案。以下是我拥有的代码模式: 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&a

我一直在阅读关于这个主题的不同问题,但没有找到一个完全符合我所寻找的答案。以下是我拥有的代码模式:

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);
}
为什么调用bar的运行时调度不起作用?如果我在派生中重载foo,那么它会调用foo的派生版本,为什么它不能对bar执行动态调度呢


因为我使用的是现有代码,所以我不希望在这里更改类的基本结构。我希望能找到一种方法让电话正常工作,或者理解为什么不能。在阅读其他问题的基础上,我尝试了很多不同的方法,但都没有用。

结果证明这不是模板问题。代码的问题在于派生的::bar方法没有标记为const,而TmplClass::bar方法标记为const。所以,我们的目的是提供一个超越,但实际上派生::bar是一个具有不同签名的完全不同的方法,所以这就是为什么它给出了不期望的行为。一旦从TmplClass::bar中删除常量或将其添加到派生的::bar中,则签名匹配并接收预期输出:

Template::Foo
Derived::Bar

Base
Derived
的祖先中在哪里?这看起来不像是一个有效的例子
voidfoo(void)
方法不存在,
Base
不是任何东西的祖先类。请提供工作代码。它不工作,因为此代码未编译。编译并运行正常。抱歉,TmplClass缺少“:public Base”。而且,事实证明,模板问题只是一个转移视线的问题。在实际代码中,我的派生::Bar定义没有像TmplClass::Bar那样标记为const,因此我实际上没有重写该方法。
Template::Foo
Derived::Bar