首页 > 学院 > 开发设计 > 正文

菱形继承&菱形虚拟继承

2019-11-08 18:29:21
字体:
来源:转载
供稿:网友

菱形继承模型

模型对应代码:

#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中成员变量的后面。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表