运行时绑定和模板实例化

Runtime binding and template instantiation

本文关键字:实例化 绑定 运行时      更新时间:2023-10-16

从这里可以看出,并非所有模板函数都在模板类中编译。 标准说,如果未使用方法或成员,则不会对其进行编译。确实很酷的功能!现在,让我们讨论以下层次结构:

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

重要的相关问题:C++类成员函数模板可以是虚拟的吗?

程序中的某个地方,您必须使用B<int>或派生的类型来创建实例。此时,将实例化模板并生成其代码。还有显式实例化。有关详细信息,请查看 cppreference.com。