在C++中虚函数在c++中的实现机制就是用虚表和虚指针。下面举个例子:
// 2014525_5.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
using namespace std;
class A
{
public:
virtual void f(){ cout << "基类A f"<<endl;};
virtual void g(){ cout << "基类A g"<<endl;};
private:
int a;
};
class B: public A
{
public:
void g() { cout << "派生类B g" << endl;}
private:
int b;
};
int _tmain(int argc, _TCHAR* argv[])
{
A aA;
B bB;
A *pA= &bB;
pA->g(); //call *(pA->__vfptr)[1]
return 0;
}
我们通过对程序进行调试跟踪如下:
aA对象的内存分配:
很明显,编译器,为A类准备了一个虚拟表A::vftable
A::f 的地址 |
A::g 的地址 |
bB对象的内存分配:
当某次出现B bB的时候,编译器分配空间,bB的布局如下:
__vfptr : 指向B的虚表B::vftable |
int a: 继承A的成员 |
int b: B成员 |
因为B继承了A,故编译器也为B准备了一个虚拟表vftable:
A::f 的地址 |
B::g 的地址 |
注意,这里因为B:g重写了,因此B的虚表中的g是放B::g的入口地址。
pA的内存块区域:
参考:
http://blog.csdn.net/jiangnanyouzi/article/details/3720807
A::f 的地址 |
A::g 的地址 |
A::f 的地址 |
B::g 的地址 |
vptr : 指向B的虚表vtableB |
int a: 继承A的成员 |
int b: B成员 |