这里为大家总结一下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<
<
代码如上,我们通过调试可以发现:
虚拟继承多出来四个字节,那么它的模型是怎么样的呢?
我们来继续看一下
![]()
![](https://img-blog.csdn.net/20161106172505356?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
我发现,他的内存里放的好像是个地址,试着打开这个地址
输入第一个地址:![](https://img-blog.csdn.net/20161106172648497?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![]()
如下
![]()
![](https://img-blog.csdn.net/20161106172730107?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
输入第二个地址:![](https://img-blog.csdn.net/20161106172852310?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![]()
如下
![]()
![](https://img-blog.csdn.net/20161106172530237?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
得到如下:
![]()
![](https://img-blog.csdn.net/20161106172930429?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
然后十六进制转化为十进制
模型如下:
![](https://img-blog.csdn.net/20161106172547347?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![]()
谢谢大家的浏览,如果有什么问题可以一起探讨呦!