2010-08-15 129 views
2

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

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"); 
    } 
} 

酒吧on_added函数永远不会被调用。添加模板子类可以选择覆盖的回调的最佳方法是什么?谢谢

+2

难道你不是在基类的void on_added(...)前面缺少虚拟吗? – 2010-08-15 17:51:09

+0

是的,它的工作原理,谢谢。 Newb错误,我应该删除这个问题吗? – sharvey 2010-08-15 17:54:00

回答

4

使用 '虚拟' ...

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"); 
    } 
} 
2

Foo中的on_added函数需要是虚拟的。

0

你必须做的功能virtual如果你想在基类中调用使用在派生类中实现:

template <typename t> 
class Foo { 
    ... 
    virtual void on_added(T *t) { } 
}; 

请注意,这不是特别的模板,而是适用于所有类。

0

其他人都已经回答了这个问题。我只是补充一点,添加虚拟函数会破坏类的向后兼容性。因此,如果这是您控制的类,并且没有其他相关类,那么您可以继续并将on_added转换为虚拟类,如果不是,则需要确保从属模块也已重建。