【问题标题】:Template and Virtual functions in C++ ? allowed ?C++ 中的模板和虚函数?允许?
【发布时间】:2011-11-04 23:36:20
【问题描述】:

我在网上看到不允许使用模板虚函数,这是真的吗? 这有点奇怪,因为这段代码在我的 Eclipse 的 g++ 上编译得很好

template <class T>
class A {

public:
    virtual ~A<T>() { }
    virtual void printMe() {cout << "I am A class" << endl;}
};

template <class T>
class B: public A<T> {

public:
    void printMe() {cout << "I am B class" << endl;}
};

int main() {

    A<int> * ptr = new B<int>;
    ptr->printMe();
    delete ptr;
    return 0;
}

问候,罗南

【问题讨论】:

标签: c++ templates virtual


【解决方案1】:

模板类型中的虚拟方法(如您的示例所示)是有效的。

您所指的限制采用这种形式:

class type {
  //...
  template <typename T> virtual void r() const;
};

【讨论】:

  • 那你的意思是c++中不存在模板和虚函数?可能是什么原因?虚拟的动态绑定和模板的早期绑定?他们不混合?
  • 在这里查看 David 的出色回答:stackoverflow.com/questions/757270/…
  • 只是看我做对了,大卫实际上是说每个虚函数都有自己的地址存储在vtable中。现在,只有在我们决定之后才会声明模板方法关于它的类型。如果我们对方法 f() 有几种不同的类型,那么我们在内存中的不同位置会有相同的函数,编译器将不知道该选择哪一个?
  • 关闭。编译器知道选择哪个确实没有问题——我希望这样的实现简单地使用“一个定义规则”。问题的核心是它会强制 vtable 在运行时变得可变,并显着改变对象初始化和虚拟调用的调度。当前形式的 vtable 可以被认为是不可变的,并且始终保证正确的初始化。 (续)
  • (cont) 允许突变会带来很多变化。可以安全地实现突变,但这是(我相信)许多 C++ 开发人员不喜欢的代价。它会给非常快速的动态调度增加很多开销,并且动态调度将不再是恒定时间。此外,需要一些语言/运行时扩展来实现这一点。幸运的是,有足够多的语言特性,这对于大多数程序来说并不是一个典型的问题。
【解决方案2】:

你这里的不是模板虚函数,而是一个包含普通虚函数的模板类。

如您所见,这完全没问题。

【讨论】:

    猜你喜欢
    • 2011-11-04
    • 1970-01-01
    • 2018-02-01
    • 2017-06-10
    • 2013-12-08
    • 1970-01-01
    • 2022-11-24
    • 2012-02-13
    • 2021-11-08
    相关资源
    最近更新 更多