如果类模板成员函数不允许virtual
,为什么以下代码有效?
template <typename T>
class Test {
public:
virtual ~Test() {}
virtual void Func(const T&) {}
};
答案 0 :(得分:4)
...如果类模板成员函数不允许
virtual
?
我认为这里的问题是术语含糊不清:
完全允许在类模板中包含virtual
个函数。实际上,如果您要将Test<T>
子类化并通过指向virtual
的指针删除子类的实例,则可能要求Test<T>
的析构函数为Test<T>
。 。有关详细讨论,请参阅When to use virtual destructors?。
您可以做的是将功能模板设为虚拟。请参阅Can a C++ class member function template be virtual?
答案 1 :(得分:4)
你已经有一些答案可以解释什么是有效的,什么不是,但让我试着用不同的方式来解释这个问题:
&#34;类模板成员函数&#34;很暧昧。它可能意味着类模板的成员函数,或者它可能意味着类的模板成员函数。前者可以是virtual
(只要它们本身不是模板成员函数),后者不能。{/ p>
似乎有人声称virtual
不允许在类模板成员函数上,并且意味着类的模板成员函数,但您对它的解释不同。
答案 2 :(得分:3)
您不能拥有模板virtual
成员函数(更多here)。你所拥有的是一个具有virtual
成员函数的模板类,它完全没问题。
答案 3 :(得分:3)
如果使用以下语法,代码将无法编译:
template <typename T> virtual Func(const T&){}
这没有意义,因为虚函数在运行时被限制以允许动态多态,但如果函数是模板,则它意味着在编译时被实例化(静态多态)。 在您的情况下,您的函数不是模板,因此可以在模板类中声明为虚拟。