gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:11:39 24 4
gpt4 key购买 nike

我知道关于这个话题的话题很少。但是真正让我困惑的是我得到的结果和大家说的不一样。

看下面这段代码(使用 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++ - 为什么编译器允许在模板类中使用这个虚函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9684020/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com