这是虚拟成员函数模板吗?

时间:2014-12-25 09:47:11

标签: c++ templates virtual-functions

如果类模板成员函数不允许virtual,为什么以下代码有效?

template <typename T>
class Test {

public:

    virtual ~Test() {}  
    virtual void Func(const T&) {}
};

4 个答案:

答案 0 :(得分:4)

  

...如果类模板成员函数不允许virtual

我认为这里的问题是术语含糊不清:

答案 1 :(得分:4)

你已经有一些答案可以解释什么是有效的,什么不是,但让我试着用不同的方式来解释这个问题:

&#34;类模板成员函数&#34;很暧昧。它可能意味着类模板的成员函数,或者它可能意味着类的模板成员函数。前者可以是virtual(只要它们本身不是模板成员函数),后者不能。{/ p>

似乎有人声称virtual不允许在类模板成员函数上,并且意味着类的模板成员函数,但您对它的解释不同。

答案 2 :(得分:3)

您不能拥有模板virtual成员函数(更多here)。你所拥有的是一个具有virtual成员函数的模板类,它完全没问题。

答案 3 :(得分:3)

如果使用以下语法,代码将无法编译:

template <typename T> virtual Func(const T&){}

这没有意义,因为虚函数在运行时被限制以允许动态多态,但如果函数是模板,则它意味着在编译时被实例化(静态多态)。 在您的情况下,您的函数不是模板,因此可以在模板类中声明为虚拟。