我知道关于这个话题的线索很少.但让我感到困惑的是我得到的结果与大家所说的不同.
看下面的代码(使用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-B Dtor-A Dtor-B Dtor-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.