c++ 继承 总结

这里为大家总结一下c++ 里面继承的问题

#include <iostream>
using namespace std;

//1.继承中的权限变化问题
/*
class A
{
public:
	int _pub;
protected:
	int _pro;
private:
	int _pri;
};


class D:public A   //公有继承
{
public:
	void FunTest1()
	{
		_pub = 10;
		_pro = 20;
		//_pri = 30;  //如果加上这个就会编译失败
	}
};

class D1:protected A //保护继承
{
public:
	void FunTest2()
	{
		_pub = 10;
		_pro = 20;
		//_pri = 30;  //加上这个这里依然会编译失败
	}
};

class D2:private D
{
public:
	void FunTest3()
	{
		_pub = 10;
		_pro = 20;
		//_pri = 30;
	}
};

class D3:public D
{
public:
	void FunTest4()
	{
		_pub = 10;
		//_pro = 20;
		//_pri = 30;
	}
};
*/

//2.继承体系中的作用域
/*
class A
{
public:
	int _data;
};

class D:public A
{
public:
	int _data;
};
int main()
{
	D d;
	d._data = 10;
	d.A::_data = 20;
	//通过监视窗口可知,第一个种形式是给D类中的数据赋值,第二个才是给A类中的数据赋
}
*/

<img src="https://img-blog.csdn.net/20161106172331625?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
//3.赋值兼容规则
/*
class A
{
public:
	int _data;
};

class D:public A
{
public:
	int _data1;
};
int main()
{
	A a;
	D d;*/
	/*  //可以成功
	D* pb = &d;
	d._data = 10;
	d._data1 = 20;
	*/

	/*  //失败
	D* pb = &a;
	pb->_data = 10;
	pb->_data1 = 20;
	*/

	/*  //成功
	A* pb = &a;
	pb->_data = 10;
	*/

	/*  //成功
	A* pb = &d;
	pb->_data = 10;
	*/

//}



//4.单继承
/*
class A
{
public:
	int _data1;
};
class D:public A
{
public:
	int _data2;
};
*/
构建的模型如下:





//5.多继承
/*
class A
{
public:
	int _data1;
};
class B
{
public:
	int _data2;
};
class D:public A,public B 
{
public:
	int _data3;
};
*/
构建的模型如下:




//6.菱形继承 或者 钻石继承
/*
class A
{
public:
	int _data1;
};
class B1:public A
{
public:
	int _data2;
};
class B2:public A
{
public:
	int _data3;
};
class D:public B1,public B2
{
public:
	int _data4;
};

void FunTest()
{
	D d;
	//d._data1 ? 这里的_data1是B1里面的?还是B2里面的?产生了二义性!
	d.B1::_data1 = 10;//只能这样访问了
	d.B2::_data1 = 20;//
}
int main()
{
	FunTest();
	return 0;
}
*/
模型如下:







接下来的虚拟继承会复杂一下,我利用图文说明一下:
//虚拟继承
//虚拟继承很好的解决了这个问题
class A
{
public:
	int _data1;
};
class B1:virtual public A
{
public:
	int _data2;
};
class B2:virtual public A
{
public:
	int _data3;
};
class D:public B1,public B2
{
public:
	int _data4;
};

void FunTest()
{
	cout<
     
     
      
      <
      
      
     
     
代码如上,我们通过调试可以发现:


虚拟继承多出来四个字节,那么它的模型是怎么样的呢?
我们来继续看一下

我发现,他的内存里放的好像是个地址,试着打开这个地址

输入第一个地址:

如下



输入第二个地址:

如下


得到如下:



然后十六进制转化为十进制

模型如下:




谢谢大家的浏览,如果有什么问题可以一起探讨呦!


  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值