2010-08-15 123 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轉換爲虛擬類,如果不是,則需要確保從屬模塊也已重建。