首先,在介绍有虚函数的多继承(未重写虚函数),先介绍一下以下概念。
多态:多种形态,简单地说父类的指针或引用调用重写的虚函数,当父类的指针或引用指向父类对象调用的就是父类的虚函数,指向子类对象时调用的就是是子类的虚函数
虚函数:C++中虚函数的主要作用就是实现多态, 在一个类的成员函数前面加上virtual关键字,该函数就被定义成虚函数,虚函数的地址存放在虚表(存放虚函数地址的表,虚表的地址存放在所定义对象中)
那么,当一个子类有多个父类,子类的虚表会放在什么位置?
请看下例:
class Base
{
public:
virtual void FunTest1()
{
cout << "Base::FunTest1()" << endl;
}
virtual void FunTest2()
{
cout << "Base::FunTest2()" << endl;
}
int _data1;
};
class Base1
{
public:
virtual void FunTest3()
{
cout << "Base1::FunTest3()" << endl;
}
virtual void FunTest4()
{
cout << "Base1::FunTest4()" << endl;
}
int _data2;
};
class Derive :public Base, public Base1
{
public:
virtual void FunTest5()
{
cout << "Derive::FunTest5()" << endl;
}
int _data3;
};
typedef void(*VtbFun)();
void PrintVtable()
{
Derive d1;
d1._data1 = 0x01;
d1._data2 = 0x02;
int* pVTable = (int *)*(int*)&d1;
VtbFun FunTest = (VtbFun)*pVTable;
while (NULL != FunTest)
{
FunTest();
cout << (int*)FunTest << endl;
pVTable += 1;
FunTest = (VtbFun)*pVTable;
}
}
int main()
{
Derive d;
d._data1 = 0x01;
d._data2 = 0x02;
d._data3 = 0x03;
PrintVtable();
return 0;
}