我听说很多时候通常使用vtable实现虚函数。但实际上我并不知道它是如何实现的以及它是如何工作的。
修改的
我实际上并没有得到这样的代码:如何重写它。有人可以详细解释一下。
最后,让我们看看编译器如何实现对虚函数的调用。您的代码可能如下所示:
// Your original C++ code
void mycode(Base* p)
{
p->virt3();
}
编译器不知道这是调用Base::virt3()
还是Der::virt3()
,还是调用另一个尚未存在的派生类的virt3()
方法。它只能确定你正在调用virt3()
,它恰好是v-table的插槽#3中的函数。它将该调用重写为以下内容:
// Pseudo-code that the compiler generates from your C++
void mycode(Base* p)
{
p->__vptr[3](p);
}
答案 0 :(得分:4)
C ++ FAQ上internals of virtual functions的解释非常好。你应该读一读。我想如果你自己试图理解它然后问你的怀疑会更好。
答案 1 :(得分:0)
常见的实现是在指向vtable的对象的每个实例的开头都有一个指针。每个类有一个vtable,所以如果你有一个A类和B类,每个都会有一个表。
vtable本质上有一堆函数指针,所以如果类A有两个虚函数foo()和bar(),那么表将有两个指针。如果B类重写了这两个函数,它的foo()和bar()版本将具有相同的偏移量。
答案 2 :(得分:0)
理解vtable如何工作的一种简单方法是使用函数指针在C中实现相同类型的功能,因为vtable的所有内容都是指向具体实现的函数指针表。