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

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

概述我知道关于这个话题的线索很少.但让我感到困惑的是我得到的结果与大家所说的不同. 看下面的代码(使用GCC441编译): #include <iostream>using namespace std;template<class T>class A { public: A(T &t) : _a(t) {}; virtual ~A() { cout << "Dtor-A" 我知道关于这个话题的线索很少.但让我感到困惑的是我得到的结果与大家所说的不同.

看下面的代码(使用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 – 为什么编译器在模板类中允许这个虚函数?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1236625.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存