运行时绑定和模板实例化

时间:2016-03-10 04:02:24

标签: c++ templates c++11

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

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

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

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

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

编译器如何猜测/发现这种情况以生成B<int>::f

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

1 个答案:

答案 0 :(得分:1)

在程序的某个地方,您必须使用B<int>或从中派生的类型来创建实例。此时,模板被实例化并生成其代码。还有明确的实例化。查看cppreference.com了解详情。