菱形继承&菱形虚拟继承

菱形继承模型



模型对应代码:

#include<iostream>
using namespace std;

class Base
{
public:
	Base()
		:_b1(1){}
	virtual void fun1()
	{
		cout << "Base1::fun1()" << endl;
	}
	virtual void fun2()
	{
		cout << "Base1::fun2()" << endl;
	}
private:
	int _b1;
};
class Base2 :public Base
{
public:
	Base2()
		:_b2(1){}
	virtual void fun1()
	{
	cout << "Base2::fun1()" << endl;
	}
	virtual void fun3()
	{
		cout << "Base2::fun2()" << endl;
	}
private:
	int _b2;
};
class Base3 :public Base
{
public:
	Base3()
		:_b3(1){}
	virtual void fun1()
	{
		cout << "Base3::fun1()" << endl;
	}
	virtual void fun3()
	{
		cout << "Base3::fun2()" << endl;
	}
private:
	int _b3;
};
class Deriver :public Base2, public Base3
{
public:
	Deriver()
		:_d3(3){}
	virtual void fun1()
	{
		cout << "Deriver::fun1()" << endl;
	}
	virtual void fun4()
	{
		cout << "Deriver::fun3()" << endl;
	}
private:
	int _d3;
};

根据监视窗口及运行结果可以看出Deriver的虚函数存放在第一个虚函数表的最后。

菱形虚拟继承

菱形虚拟继承模型


class Base

{

public:

       Base()

              :_b1(1){}

       virtual void fun1()

       {

              cout << "Base1::fun1()" << endl;

       }

       virtual void fun2()

       {

              cout << "Base1::fun2()" << endl;

       }

private:

       int _b1;

};

class Base2:virtual public Base

{

public:

       Base2()

              :_b2(2){}

       virtual void fun1()

       {

              cout << "Base2::fun1()" << endl;

       }

       virtual void fun3()

       {

              cout << "Base2::fun2()" << endl;

       }

private:

       int _b2;

};

class Base3:virtual public Base

{

public:

       Base3()

              :_b4(3){}

       virtual void fun1()

       {

              cout << "Base3::fun1()" << endl;

       }

       virtual void fun3()

       {

              cout << "Base3::fun2()" << endl;

       }

private:

       int _b3;

};

class Deriver:public Base2,public Base3

{

public:

       Deriver()

              :_d3(4){}

       virtual void fun1()

       {

              cout << "Deriver::fun1()" << endl;

       }

       virtual void fun4()

       {

              cout << "Deriver::fun4()" << endl;

       }

private:

       int _d4;

};

由于是虚继承所以Base2和Base3中的Base _vfptr存放的是偏移量的地址,根据偏移量可以找到Base。且存放在Deriver中成员变量的后面。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值