【发布时间】:2014-04-08 20:45:08
【问题描述】:
据我所知,由于 vtable 的大小未定义,因此不允许/可能使用模板化虚函数。
另一方面,类模板中不使用模板类型的虚函数似乎是允许的,对吧?
不使用模板类型作为参数或返回类型但对模板类型的数据起作用的虚函数呢?那是有效的 C++ 吗?
我已经做了一些测试,它似乎可以工作。
我的代码如下所示:
(注意:为了可读性,这只是基本结构,不是真正的代码)。
template<typename T>
class Base {
public:
virtual bool compare(void) {
// Basic implementation
return ((value1 + value2) < value3);
}
protected:
T value1, value2, value3;
}
/**
* Derived from Base<ComplexClass> where
* ComplexClass is a Class providing
* a int Value through .getInt()
**/
class Derived : Base<ComplexClass> {
bool compare(void) {
return ((value1.getInt() + value2.getInt()) < value3.getInt());
}
}
main {
Base<int> *intBase = new Base<int>();
Base<double> *doubleBase = new Base<double>();
Base<ComplexClass> *complexBase = new Derived();
intBase->compare(); // Should call base function
doubleBase->compare(); // Should also call base function
complexBase->compare(); // Should call the compare function of Derived
}
据我所知,这就像我例外。这只是一个幸运的巧合,还是这种有效/良好的 C++ 风格?
如果有效,有人能解释一下里面发生了什么吗?为什么有人说从类模板派生并在类模板中使用虚函数是禁止/不好的做法?
提前谢谢你!
PS:我知道模板专业化可以完成类似的事情,但我想知道这种方式是否也可以。
【问题讨论】:
-
它完全有效,并且与任何其他(非模板)类具有虚函数一样工作。
-
模板方法 != 模板类
-
我想Paranaix 想说的是:问题出在虚函数模板,而不是类模板的虚成员函数。只要有固定数量的成员函数,vtable的大小是已知的,没有问题。但是成员函数模板可以在不同的地方为任意数量的模板参数(以及每个翻译单元中的不同参数)实例化。
标签: c++ class templates virtual