2010-09-11 46 views
2

我听说很多时候虚拟功能通常是用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); 
} 
+0

http://en.wikipedia.org/wiki/Vtable – Potatoswatter 2010-09-11 12:51:29

回答

0

常见的实现是在指向vtable的对象的每个实例的开始处都有一个指针。每个班级有一个vtable,所以如果你有一个班级A和班级B,每个班级会有一个表格。

vtable基本上有一堆函数指针,所以如果类A有两个虚函数foo()和bar(),表中将有两个指针。如果B类重写这两个函数,它的版本foo()和bar()会有相同的偏移量。

0

了解vtable如何工作的一个简单方法是使用函数指针在C中实现相同类型的功能,因为vtable的功能都是指向具体实现的函数指针表。