2011-11-01 60 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也是虚拟的。