覆盖模板化的类函数

时间:2010-08-15 17:47:39

标签: c++ templates callback

我正在尝试为类模板创建某种回调。代码是这样的:

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函数永远不会被调用。添加模板子类可以选择覆盖的回调的最佳方法是什么?感谢

4 个答案:

答案 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转换为虚拟,如果不是,你需要确保依赖模块也被重建。