虚拟关键字内部

时间:2010-09-11 07:51:32

标签: c++

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

3 个答案:

答案 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的所有内容都是指向具体实现的函数指针表。

相关问题