一个简单类中的虚方法真的是虚的吗?



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

class A
{
virtual void f() {}
}

我想知道"虚拟的"方法实际上并不是真正的虚拟,因此类与

相同。
class A
{
void f() {}
}

你知道没有派生类型。编译器不知道这些。这样的类型,如果曾经定义过,将在A定义后的某个时间定义。

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

A a;
a.f();

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

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

相关内容

最新更新