我听说很多时候通常使用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/