c – 为什么编译器在模板类中允许这个虚函数?

前端之家收集整理的这篇文章主要介绍了c – 为什么编译器在模板类中允许这个虚函数?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我知道关于这个话题的线索很少.但让我感到困惑的是我得到的结果与大家所说的不同.

看下面的代码(使用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.

猜你在找的C&C++相关文章