我正在尝试为类模板创建某种回调。代码是这样的:
template <typename t>
class Foo {
void add(T *t) {
prinf('do some template stuff');
on_added(t);
}
void on_added(T *t) { }
}
struct aaa {}
class Bar : Foo<aaa> {
void on_added(aaa *object) {
printf("on added called on Bar");
}
}
Bar上的on_added函数永远不会被调用。添加模板子类可以选择覆盖的回调的最佳方法是什么?感谢
答案 0 :(得分:4)
使用'virtual'...
template <typename t>
class Foo {
void add(T *t) {
prinf('do some template stuff');
on_added(t);
}
virtual void on_added(T *t) { }
}
struct aaa {}
class Bar : Foo<aaa> {
void on_added(aaa *object) {
printf("on added called on Bar");
}
}
答案 1 :(得分:2)
Foo中的on_added函数需要是虚拟的。
答案 2 :(得分:0)
如果希望基类中的调用使用派生类中的实现,则必须创建函数virtual
:
template <typename t>
class Foo {
...
virtual void on_added(T *t) { }
};
请注意,这对模板并不特殊,但适用于所有类。
答案 3 :(得分:0)
其他人已经回答了这个问题。我只想补充说,添加虚函数会破坏类的向后兼容性。所以,如果这是一个你控制的类,并且没有其他依赖类,那么是的,你可以继续将on_added
转换为虚拟,如果不是,你需要确保依赖模块也被重建。