繁体   English   中英

运行时绑定和模板实例化

[英]Runtime binding and template instantiation

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

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了解详细信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM