调用虚函数和非虚函数之间的区别?

che*_*eng 9 c++ virtual-functions function-calls

这实际上是一个面试问题,我无法弄清楚答案.谁知道这件事?您可以谈论任何差异,例如,推入堆栈的数据.

Alo*_*ave 25

虽然虚拟主义/动态调度是严格实现定义的,但大多数(读取所有已知)编译器通过使用vptr和实现它vtable.

话虽如此,调用非虚函数和虚函数的区别在于:

非虚函数解决staticallyCompile-time,虽然虚拟函数解决dynamicallyRun-time.

为了实现能够决定在运行时调用哪个函数的灵活性,虚拟函数的情况下会有一点开销.

fetch需要执行的额外调用,它是您使用动态调度支付的开销/价格.

在非虚函数的情况下,调用序列是:

fetch-call
Run Code Online (Sandbox Code Playgroud)

编译器需要对fetch函数进行寻址然后再进行寻址call.

在虚函数的情况下,序列是:

fetch-fetch-call
Run Code Online (Sandbox Code Playgroud)

编译器需要fetchvptrthis,然后fetch在从函数的地址vptr,然后call该功能.

这只是一个简单的解释,实际的序列可能比这复杂得多,但这是你真正需要知道的,一个并不真正需要知道实现的细节.

好读:

继承与虚函数


小智 5

如果你有一个基类'Base'和派生类'Derived',你有一个函数'func()'在Base类中定义为虚拟.Derived类会覆盖此函数.

假设你定义

       Base obj = new Derived();
       obj.func();
Run Code Online (Sandbox Code Playgroud)

然后调用Derived类的'func'.如果'func()'在Base中没有被定义为虚拟,那么它将从'Base'类调用.这是函数调用对于虚函数和非虚函数的不同之处

  • 一些微妙的点: 1. `obj` 需要是一个指针。2. 容易提到覆盖函数`Derived::func()` 应该采用相同的参数来覆盖`Base::func()` (2认同)