简单类中的虚方法真的是虚的吗?
我有一个简单的类,它没有派生类型,也没有与其他类的继承关系。
class A
{
virtual void f() {}
}
我想知道“虚拟”方法实际上是否真的不是虚拟的,所以该类与
class A
{
void f() {}
}
回答
你知道没有派生类型。编译器不知道。此类类型,如果曾经定义过,将在定义后稍后A定义。
因此,无论在哪里A使用,f()都必须被视为虚拟,除非编译器可以证明否则,例如在调用f()静态类型A对象时,例如:
A a;
a.f();
在这种情况下,编译器可以A::f()静态调用,因为它知道它不可能调用其他任何东西。
但是当f()通过A&引用或A*指针调用时,编译器将不得不使用虚拟分派,因为编译器无法确切知道运行时正在使用什么类型的对象。
- *编译器将不得不使用虚拟分派* 没有必要。可以应用去虚拟化。完美文章:https://hubicka.blogspot.com/2014/01/devirtualization-in-c-part-1.html
- @SM 那篇文章同意并执行我的声明,而不是不同意他们。在编译器知道虚拟调用不需要虚拟分派的上下文中,它可以被优化掉。但是当通过引用/指针进行虚拟调用时,虚拟调度不能被优化掉。