我听说很多时候通常使用vtable来实现虚拟功能。但是我实际上并不真正知道它是如何实现的以及它是如何工作的。

编辑

我实际上并没有得到以下代码:如何对其进行重写。有人可以详细解释一下。

最后,让我们看看编译器如何实现对虚拟函数的调用。您的代码可能如下所示:

 // Your original C++ code

 void mycode(Base* p)
 {
   p->virt3();
 }

编译器不知道这是要调用Base::virt3()还是Der::virt3(),或者是调用另一个尚不存在的派生类的virt3()方法。它仅确定您要调用的virt3()恰好是v表的插槽3中的函数。它将该调用重写为如下形式:
 // Pseudo-code that the compiler generates from your C++

 void mycode(Base* p)
 {
   p->__vptr[3](p);
 }

最佳答案

常见的实现是在指向vtable的对象的每个实例的开头都有一个指针。每个类都有一个vtable,因此,如果您有A类和B类,则每个都有一个表。

vtable本质上具有一堆函数指针,因此,如果类A具有两个虚函数foo()和bar(),则表将具有指向这两个函数的指针。如果类B覆盖了这两个函数,则其foo()和bar()的版本将具有相同的偏移量。

关于c++ - 虚拟关键字内部,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3690238/

10-12 23:29