看下面的代码(使用GCC441编译):
#include <iostream>using namespace std;template<class T>class A { public: A(T &t) : _a(t) {}; virtual ~A() { cout << "Dtor-A" << endl;}; virtual voID print () { cout << "A: " << _a << endl; } T _a;};class B : public A<int> { public: B(int t) : A<int>(t) {} ~B() { cout << "Dtor-B" << endl;}; voID print() { cout << "B: " << endl; }};int main() { B b(2); A<int> *a = &b; a->print(); A<int> *a2 = new B(4); a2->print(); delete a2;}
结果是:
B: B: Dtor-BDtor-ADtor-BDtor-A解决方法 你不能在类中使用虚函数模板– this would be meaningless – 但是类模板中的虚函数是可以的.
一旦该类模板Foo被实例化,所得到的类Foo< T>具有虚拟功能,可以像使用任何其他类型一样使用.
让我们来看看两者之间的区别:
不好
struct Foo { template <typename T> virtual voID bar() {} // Foo::bar<T> - prohibited,as marked "virtual"};// Impossible to resolve calls to Foo::bar<T>() at runtime,since// such calls may require template instantiation,which may only occur// at compile-time.
好
template <typename T>struct Foo { virtual voID bar() {} // Foo<T>::bar};// If Foo<T> is used in the program,then it will exist,in entirety.// Foo<T>::bar() may thus be used as noraml.总结
以上是内存溢出为你收集整理的c – 为什么编译器在模板类中允许这个虚函数?全部内容,希望文章能够帮你解决c – 为什么编译器在模板类中允许这个虚函数?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)