2011-11-01 32 views
3

模板的早期綁定和虛擬函數的後期綁定。因此,如果一個模板包含虛擬功能,是否安全?如果模板包含虛擬功能,它安全嗎?

template<typename T> 
class base { 
public: 
    T data; 
    virtual void fn(T t){} 
}; 
+2

您是否期望有問題?你會如何編寫一個程序來檢查它是否正常工作?當你運行該程序時會發生什麼? –

回答

9

這是完全安全的。一旦你實例化類模板,它就像其他類一樣成爲普通類。

template<typename T> 
class base { 
public: 
    T data; 
    virtual void fn(T t){} 
}; 


class derived : base<int> { 
public: 
    virtual void fn(int t){} //override 
}; 

base<int> *pBase = new derived(); 
pBase->fn(10); //calls derived::fn() 

我還要指出的是,雖然它是允許虛擬功能在類模板,這是不允許的虛擬功能模板類內部(如下所示):

class A 
{ 
    template<typename T> 
    virtual void f(); //error: virtual function template is not allowed 
}; 
+0

它是一個虛擬功能模板? – krammer

+0

@krammer:因爲它是一個函數模板,並且用'virtual'關鍵字聲明,所以它是一個虛函數模板。 – Nawaz

+0

哦謝謝。在虛擬之前,我被換行符誤導了。 – krammer

0

有在template類中不存在與virtual函數相關的安全問題。它和正常的class中的virtual函數一樣好。

1

是的,這是相當安全的。你會被具有類使用它從中獲得:

class derived : public base<int> { 
    virtual void fn(int) { std::cout << "derived"; } 
}; 

當然,如果它包含任何其他虛擬功能(即,意在作爲一個基類),你一般要打dtor也是虛擬的。