模板的早期綁定和虛擬函數的後期綁定。因此,如果一個模板包含虛擬功能,是否安全?如果模板包含虛擬功能,它安全嗎?
template<typename T>
class base {
public:
T data;
virtual void fn(T t){}
};
模板的早期綁定和虛擬函數的後期綁定。因此,如果一個模板包含虛擬功能,是否安全?如果模板包含虛擬功能,它安全嗎?
template<typename T>
class base {
public:
T data;
virtual void fn(T t){}
};
這是完全安全的。一旦你實例化類模板,它就像其他類一樣成爲普通類。
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
};
有在template
類中不存在與virtual
函數相關的安全問題。它和正常的class
中的virtual
函數一樣好。
是的,這是相當安全的。你會被具有類使用它從中獲得:
class derived : public base<int> {
virtual void fn(int) { std::cout << "derived"; }
};
當然,如果它包含任何其他虛擬功能(即,意在作爲一個基類),你一般要打dtor也是虛擬的。
您是否期望有問題?你會如何編寫一個程序來檢查它是否正常工作?當你運行該程序時會發生什麼? –