【发布时间】:2021-10-20 20:00:36
【问题描述】:
我有一个简单的类,它没有派生类型,也没有与其他类的继承关系。
class A
{
virtual void f() {}
}
我想知道“虚拟”方法实际上是否不是真正的虚拟,所以类是一样的
class A
{
void f() {}
}
【问题讨论】:
-
定义“真正的虚拟”。
标签: c++ inheritance virtual-functions
我有一个简单的类,它没有派生类型,也没有与其他类的继承关系。
class A
{
virtual void f() {}
}
我想知道“虚拟”方法实际上是否不是真正的虚拟,所以类是一样的
class A
{
void f() {}
}
【问题讨论】:
标签: c++ inheritance virtual-functions
您知道没有派生类型。编译器不知道这一点。此类类型(如果已定义)将在定义 A 之后稍后定义。
因此,在使用 A 的地方,f() 必须被视为虚拟,除非编译器可以证明否则,例如在静态类型上调用 f() A 对象,例如:
A a;
a.f();
在这种情况下,编译器可以静态调用A::f(),因为它知道它不可能调用其他任何东西。
但是当通过A& 引用或A* 指针调用f() 时,编译器将不得不使用虚拟调度,因为编译器无法确切知道运行时正在使用什么类型的对象.
【讨论】: