如果基类中有虚函数,派生类有和基类同名的虚函数,也有不同名的虚函数,那么派生类的虚函数表的内容是按照什么规则存储的呢?
#include <iostream>
#include <tchar.h>
using namespace std;
class Human
{
public:
virtual void walk()
{
cout << _T("Human::walk") << endl;
}
virtual void speak()
{
cout << _T("Human::speak") << endl;
}
virtual void eat()
{
cout << _T("Human::eat") << endl;
}
};
class Man: public Human
{
public:
virtual void sleep()
{
cout << _T("Man::sleep") << endl;
}
virtual void speak()
{
cout << _T("Man::speak") << endl;
};
virtual void run()
{
cout << _T("Man::run") << endl;
}
};
int _tmain(int argc, TCHAR argv[], TCHAR envp[])
{
typedef void(*FUN)();
Man Modi;
int* AddrOfModiVTable = (int*)(*(int*)(&Modi));
FUN pFunc = (FUN)(*AddrOfModiVTable);
pFunc();
pFunc = (FUN)(*(++AddrOfModiVTable));
pFunc();
pFunc = (FUN)(*(++AddrOfModiVTable));
pFunc();
pFunc = (FUN)(*(++AddrOfModiVTable));
pFunc();
pFunc = (FUN)(*(++AddrOfModiVTable));
pFunc();
return 0;
}
上述代码的执行结果如下:
总结:
派生类的虚函数表中,先排列基类的虚函数地址,再排列派生类的虚函数地址,当派生类的虚函数和基类的虚函数同名的时候,用派生类的虚函数地址覆盖虚函数表中同名的基类的虚函数的地址,用图表示如下所示:
图中省略了虚函数表中的NULL项