C++虚拟继承例子

本文通过实例探讨了C++中的虚继承特性,详细分析了相关代码的内存分布情况,揭示了虚继承在多态性和内存占用上的特点。
摘要由CSDN通过智能技术生成

代码如下:

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


内存分布如下所示:




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值