【问题标题】:Is the virtual method in a simple class really virtual?简单类中的虚方法真的是虚的吗?
【发布时间】:2021-10-20 20:00:36
【问题描述】:

我有一个简单的类,它没有派生类型,也没有与其他类的继承关系。

class A
{
    virtual void f() {}
}

我想知道“虚拟”方法实际上是否不是真正的虚拟,所以类是一样的

class A
{
    void f() {}
}

【问题讨论】:

  • 定义“真正的虚拟”

标签: c++ inheritance virtual-functions


【解决方案1】:

您知道没有派生类型。编译器不知道这一点。此类类型(如果已定义)将在定义 A 之后稍后定义。

因此,在使用 A 的地方,f() 必须被视为虚拟,除非编译器可以证明否则,例如在静态类型上调用 f() A 对象,例如:

A a;
a.f();

在这种情况下,编译器可以静态调用A::f(),因为它知道它不可能调用其他任何东西。

但是当通过A& 引用或A* 指针调用f() 时,编译器将不得不使用虚拟调度,因为编译器无法确切知道运行时正在使用什么类型的对象.

【讨论】:

  • 编译器必须使用虚拟调度 没必要。可以应用去虚拟化。完美篇:hubicka.blogspot.com/2014/01/devirtualization-in-c-part-1.html
  • @S.M.那篇文章同意并执行我的陈述,而不是不同意我的陈述。在编译器知道虚拟调用不需要虚拟调度的上下文中,可以对其进行优化。但是当通过引用/指针进行虚拟调用时,无法优化虚拟调度。
  • @S.M. "前端查找虚拟方法的调用它立即知道不允许派生类型并产生直接调用......前端也在构造函数中的特殊情况调用和析构函数因为这是已知指针类型的情况...因为尝试跨语句边界进行优化不是前端的工作,无论何时使用指针或引用, 调用将保持多态."
  • 请继续阅读所有 4 章。最后一个是关于通过类型继承图的静态分析执行的推测性去虚拟化。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-30
  • 2017-05-24
  • 2016-07-08
  • 2015-06-13
  • 1970-01-01
  • 2017-11-11
相关资源
最近更新 更多