代码如下:
#include<iostream>
using namespace std;
class Base {
public:
void fun(){cout<<"Base::fun"<<endl;}
virtual void f() { cout << "Base::f" << endl; }
virtual void g() { cout << "Base::g" << endl; }
virtual void h() { cout << "Base::h" << endl; }
int a;
int b;
};
class Base2:virtual public Base
{
public:
virtual void fun2(){cout<<"Base2::fun2"<<endl;}
virtual void f() { cout << "Base2::f" << endl; }
virtual void g() { cout << "Base2::g" << endl; }
virtual void h() { cout << "Base2::h" << endl; }
int a;
int b;
};
class Base3:virtual public Base
{
public:
virtual void fun3(){cout<<"Base3::fun3"<<endl;}
virtual void f() { cout << "Base3::f" << endl; }
virtual void g() { cout << "Base3::g" << endl; }
virtual void h() { cout << "Base3::h" << endl; }
int a;
int b;
};
class Derive: public Base2,public Base3
{
public:
//注意:如果Base2和Base3都是从Base继承,且都重写了Base的函数f,则Derive类必须要重写函数f,否则
//在调用的时候会引起歧义,导致出错。因此这样编译时不通过的。
virtual void f() { cout << "Derive::f1" << endl; }
virtual void g() { cout << "Derive::g1" << endl; }
virtual void h() { cout << "Derive::h1" << endl; }
virtual void fun(){ cout << "Derive::fun" << endl; }
int c;
int d;
};
int main()
{
typedef void(*Fun)(void);
Fun pFun = NULL;
Derive b;
cout<<"&b.Base::a="<<&b.Base::a<<endl;
cout<<"&b.Base::b="<<&b.Base::b<<endl;
cout<<"&b.c="<<&b.c<<endl;
cout<<"&b.d="<<&b.d<<endl;
cout<<"&b.Base2::a="<<&b.Base2::a<<endl;
cout<<"&b.Base2::b="<<&b.Base2::b<<endl;
cout<<"&b.Base3::a="<<&b.Base3::a<<endl;
cout<<"&b.Base3::b="<<&b.Base3::b<<endl;
cout << "Base2的虚函数表地址:" << (&b) << endl;
cout << "Base2的虚函数表 — 第一个函数地址:" << *(int*)(&b) << endl;
cout << "Base2的虚基类地址:" << *((int*)(&b)+1) << endl;
cout<<sizeof(b)<<endl;
pFun=(Fun)*((int*)*(int*)(&b));//Base2的虚函数
pFun();
pFun=(Fun)*((int*)*(int*)(&b)+1);//Derive的虚函数,注意Derive虚函数是在Base2的虚函数后面,
//两者共享一个虚函数指针,如果Base2没有除了基类以外的虚函数
//那这个指针就只有Derive的虚函数,如果Derive也没有除了基类
//以外的虚函数,就不存在这个虚函数指针了
pFun();
pFun=(Fun)*((int*)*((int*)&b+4));//Base3的虚函数,同上面一样,如果Base3中除了基类的虚函数外没有其他
//虚函数,则不存在这个虚函数指针,所有的虚函数都到虚基类中的虚函数
//去寻找和执行
pFun();
cout<<*((int*)(&b)+1)<<endl;//Base2的虚基类指针
cout<<*((int*)(&b)+5)<<endl;//Base3的虚基类指针
cout<<*((int*)*((int*)&b+1)+1)<<endl;//虚基类距离当前Base2的偏移量,单位是字节
cout<<*((int*)*((int*)&b+5)+1)<<endl;//虚基类距离当前Base3的偏移量,单位是字节
system("pause");
return 0;
}
运行结果如下所示:
内存分布如下所示: