このトピックに関するさまざまな質問を読んできましたが、探しているものに完全に答える質問を見つけることができませんでした。私が持っているコードのパターンは次のとおりです。
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
bar の呼び出しで実行時ディスパッチが機能しないのはなぜですか? Derived で foo をオーバーロードすると、派生バージョンの foo が呼び出されますが、bar の動的ディスパッチを実行できないのはなぜですか?
私は既存のコードで作業しているので、ここではクラスの基本構造を変更したくありません。通話を機能させる方法を見つけるか、機能しない理由を理解したいと思っています。ここで他の質問を読むことに基づいて、さまざまなことを試しましたが、すべて役に立ちませんでした。