C++虚拟继承例子

代码如下:

#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;
}
运行结果如下所示:


内存分布如下所示:




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章