2012-09-24 60 views
0

如何在子類中覆蓋基類模板化類方法(即帶有非模板方法的模板類)?覆蓋基類模板類方法

#include <Windows.h> 
#include <iostream> 

struct S{}; 

template <typename T> 
class Base 
{ 
public: 
    Base() 
    { 
     Init(); // Needs to call child 
    } 

    virtual void Init() = 0; // Does not work - tried everything 
    // - Pure virtual 
    // - Method/function template 
    // - Base class '_Base' which Base extends that has 
    //  pure virtual 'Init()' 
    // - Empty method body 
}; 

class Child : public virtual Base<S> 
{ 
public: 
    virtual void Init() 
    { 
     printf("test"); // Never gets called 
    } 
}; 

int main() 
{ 
    Child foo; // Should print "test" 

    system("pause"); 
    return 0; 
} 

我知道通過的子類類型作爲模板參數的基類,然後用static_cast的技術,但它只是這樣不潔給我的東西,應該是非常容易。

我敢肯定有背後,我只是沒有把握,因爲我一直在尋找了幾個小時,也找不到任何代碼或解決方案,以這種特殊的情況下模板的一些基本概念。

回答

3

調用構造函數從方法virtual是一個壞主意,因爲它不會得到你所期望的行爲。當Base的構造函數執行時,該對象尚未完全構建,並且還不是Child

調用它的外部構造是可行的。

+0

哦,非常有趣的是編譯器在編譯時如何捕獲它。固定/工作測試用例[此處](http://pastebin.com/hep5T5v6)。謝謝! – Qix

+0

它也應該注意這也適用於析構函數,顯然。 – Qix