【问题标题】:Runtime binding and template instantiation运行时绑定和模板实例化
【发布时间】:2016-03-10 04:02:24
【问题描述】:

here 可以看出,并非所有模板函数都在模板类中编译。标准说,如果方法或成员没有被使用,它就没有被编译。很酷的功能,确实!现在,让我们讨论以下层次结构:

class A
{
  virtual void f() {};
};

template <typename T>
class B : public A
{
  virtual void f () override
  {
       // do something dangerous
  }
}

你永远不会知道B&lt;int&gt;::f 是否被调用,对吧?原因是您可以使用动态绑定调用函数B::f,而您永远不知道A* 是指向B 类型对象还是从A 派生的其他类型对象。那么编译器应该如何处理这种情况呢?

A* ptr = nullptr;
if (i > 0)
{
    ptr = new B<int>();
}
ptr->f();

编译器如何猜测/发现这种情况以生成B&lt;int&gt;::f

重要的相关问题: Can a C++ class member function template be virtual?

【问题讨论】:

    标签: c++ templates c++11


    【解决方案1】:

    您必须在程序中的某个位置使用B&lt;int&gt; 或从那里派生的类型来创建实例。此时模板被实例化并生成它的代码。还有显式实例化。详情请查看cppreference.com

    【讨论】:

    • Kurt,我写了new B&lt;int&gt;(),因此它知道应该为int生成代码,但问题是它怎么知道我要使用B::f
    • 因为它是一个虚函数。编译器必须为实例化类型生成虚函数,因为它通常无法知道它是否被调用。
    • 您的评论就是答案。所以对于模板类,所有的虚函数都会生成。
    猜你喜欢
    • 2017-02-18
    • 2013-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-08
    • 1970-01-01
    • 2022-11-21
    相关资源
    最近更新 更多