1.如果子类中存在与父类中的虚函数同名的函数(无论此函数是否为虚函数),则子类的函数将隐覆盖所有父类的同名函数,存在虚函数表中。
2.所有的父类均各自存在一个虚函数表。
3.子类的虚函数(不与父类重名的函数),将会继续往第一个父类(如果是多重继承的话)虚函数表中增加虚函数,即子类的虚函数没有独立的虚函数表,是将虚函数放在了一个继承的父类虚函数表中。
4.假如子类存在三个父类,则地址空间中先排布第一个父类的虚函数表的地址,然后是第一个父类的成员变量;再排布第二个父类的虚函数表的地址及成员变量;再是第三个。
#include <iostream>
using namespace std;
class Base1
{
private:
int Base1_a;
int Base1_b;
int Base1_c;
public:
Base1() :Base1_a(1), Base1_b(2), Base1_c(3) {}
virtual void f() { cout << "Base1::f" << endl; }
virtual void g() { cout << "Base1::g" << endl; }
virtual void h() { cout << "Base1::h" << endl; }
};
class Base2
{
private:
int Base2_a;
int Base2_b;
int Base2_c;
public:
Base2() :Base2_a(4), Base2_b(5), Base2_c(6) {}
virtual void f() { cout << "Base2::f" << endl; }
virtual void g() { cout << "Base2::g" << endl; }
virtual void h() { cout << "Base2::h" << endl; }
};
class Base3
{
private:
int Base3_a;
int Base3_b;
int Base3_c;
public:
Base3() :Base3_a(7), Base3_b(8), Base3_c(9) {}
virtual void f() { cout << "Base3::f" << endl; }
virtual void g() { cout << "Base3::g" << endl; }
virtual void h() { cout << "Base3::h" << endl; }
};
class Derive : public Base1, public Base2, public Base3
{
private:
int Derive_a;
int Derive_b;
int Derive_c;
public:
Derive(): Derive_a(10), Derive_b(11), Derive_c(12) {}
virtual void Derive_f() { cout << "Derive::f" << endl; }
virtual void Derive_g() { cout << "Derive::g" << endl; }
};
typedef void(*Fun)(void);
int main()
{
Fun pFun = NULL;
Derive d;
int* FstPtr = (int*)&d;
int offset = 0;
//cout << "Base1 virtual function table address = 0x" << hex << *FstPtr << endl;
offset = 0;
pFun = (Fun) * ((int*)(*(FstPtr+ offset)) + 0);
pFun();//Base1_f
pFun = (Fun) * ((int*)(*(FstPtr + offset)) + 1);
pFun();//Base1_g
pFun = (Fun) * ((int*)(*(FstPtr + offset)) + 2);
pFun();//Base1_h
pFun = (Fun) * ((int*)(*(FstPtr + offset)) + 3);
pFun();//Derive_f
pFun = (Fun) * ((int*)(*(FstPtr + offset)) + 4);
pFun();//Derive_g
cout << "Base1_a = " << *((FstPtr + offset) + 1) << endl;
cout << "Base1_b = " << *((FstPtr + offset) + 2) << endl;
cout << "Base1_c = " << *((FstPtr + offset) + 3) << endl;
//cout << "sizeof(Base1) = " << sizeof(Base1)/sizeof(int) << endl;
offset = sizeof(Base1) / sizeof(int);
pFun = (Fun) * ((int*)(*(FstPtr+ offset)) + 0);
pFun();//Base2_f
pFun = (Fun) * ((int*)(*(FstPtr + offset)) + 1);
pFun();//Base2_g
pFun = (Fun) * ((int*)(*(FstPtr + offset)) + 2);
pFun();//Base2_h
cout << "Base2_a = " << *((FstPtr + offset) + 1) << endl;
cout << "Base2_b = " << *((FstPtr + offset) + 2) << endl;
cout << "Base2_c = " << *((FstPtr + offset) + 3) << endl;
//cout << "sizeof(Base1) + sizeof(Base2)= " << (sizeof(Base1) + sizeof(Base2)) / sizeof(int) << endl;
offset = (sizeof(Base1) + sizeof(Base2)) / sizeof(int);
pFun = (Fun) * ((int*)(*(FstPtr + offset)) + 0);
pFun();//Base3_f
pFun = (Fun) * ((int*)(*(FstPtr + offset)) + 1);
pFun();//Base3_g
pFun = (Fun) * ((int*)(*(FstPtr + offset)) + 2);
pFun();//Base3_h
cout << "Base3_a = " << *((FstPtr + offset) + 1) << endl;
cout << "Base3_b = " << *((FstPtr + offset) + 2) << endl;
cout << "Base3_c = " << *((FstPtr + offset) + 3) << endl;
offset = (sizeof(Base1) + sizeof(Base2) + sizeof(Base3)) / sizeof(int);
cout << "Derive_a = 0x" << hex << *((FstPtr + offset) + 0) << endl;
cout << "Derive_b = 0x" << hex << *((FstPtr + offset) + 1) << endl;
cout << "Derive_c = 0x" << hex << *((FstPtr + offset) + 2) << endl;
return 0;
}
上述代码在VS中的具体执行结果为:
内存中的排布为:
函数表的结果为: