




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第C++的继承特性你了解吗目录导语:继承作用继承的结果继承方式子类构造赋值兼容规则/向上转换/内存切片多继承虚拟继承总结
导语:
C++是对C语言的优化和改进,C++之所以优秀的点在于它的特性:抽象、封装、继承和多态。
本章总结继承的规则和特性,都是干货,与读者共同学习。
继承作用
代码的复用
子类继承父类,可以理解为,将父类的代码拷贝一份到子类中,达到子类可以调用父类方法的目的。
那为什么是可以理解而不是就是呢?
是因为有几个东西是不可以拷贝的,比如,父类的拷贝和析构方法,友元和静态成员。
友元关系是不能继承的,必须各是各的。
静态成员是在类外初始化的,从定义到程序运行结束都一直存在,不是属于某一个类的。所以也不能拷贝。
形成多态
继承在代码复用上的应用是广泛的,但在我看来,继承最大的作用在于可以形成多态,当发生一种行为时,不同的对象去调用就是不同的状态。
这在很大程度上体现了C++作为面向对象语言的设计性。
继承的结果
上面说到继承相当于将父类的代码拷贝到子类中,达到可以使用子类对象可以调用父类方法的目的,而具体子类可以调用父类的哪些方法,还需要看它的继承方式。
继承方式
公有继承
classstudent:publicPerson
公有继承,父类的公有方法以公有的形式,私有以私有的形式,保护以保护的形式,拷贝给子类,私有成员/成员方法对子类是不可见的。也就是说从对象角度:子类可以调用父类的公有方法和保护方法从方法角度:子类可以通过调用父类的公有方法/保护方法转调用父类的私有方法。
保护继承
classstudent:protectedPerson
保护继承,父类的公有方法以保护的形式,私有以私有的形式,保护以保护的形式,拷贝给子类,继承后,子类中父类的私有方法对子类不可见的。
从对象角度,可以调用父类保护方法。
从方法角度,可以通过调用父类保护方法转调用父类私有方法。
私有继承(默认继承)
classstudent:Person//什么都不给,默认私有继承
classstudent:privatePerson
私有继承,父类的所有方法均以私有的形式拷贝给子类,所有的对子类都是不可见的。
从对象角度:不能调用父类的方法
从方法角度:也不能转调用。
什么都不能用,那私有继承有什么用?
它作用的场景就是,在当前继承体系或分支,终止父类再往下继承下去。
子类构造
根据继承的拷贝性质,我们知道子类中有父类的成分,所以在构造子类之前,需要先调用父类的构造方法,再调用子类的构造方法。
但要注意,这个构造,只是构造了一个对象(子类),不会构造出来一个父类对象。
赋值兼容规则/向上转换/内存切片
继承和多态体系中,深入理解了赋值兼容规则就很容易掌握了。
赋值兼容规则:
子类对象可以直接给父类对象赋值子类对象的地址可以直接给父类对象指针赋值子类对象可以直接初始化父类对象的引用
代码:
intmain()
Dd;
Baseb;
b=d;//子类对象给父类对象赋值
Base*pb=//子类对象的地址给父类对象指针赋值
Baserb=d;//子类对象初始化父类对象的引用
return0;
总结,都是子类给父类(所以是向上转换),那么能不能父类给子类呢?
要理解这点,一个内存图即可说明一切!
很容易看出来,子类比父类的类型多了一部分,但都是序列化的,子类自身成员之前的内存空间与父类是完全一致的,所以子类是可以将地址、引用和对象转给父类的。
但是要注意,使用父类接收之后,父类对象/指针/引用,只能观察到父类拥有的,不能观察到子类。
当然,当有朝一日我们需要对父类取地址,要取到整个子类地址的时候(向下转换),C++11的reinterpret_cast强制类型转换可以实现这种需求。
赋值兼容规则的应用不在这几行代码,更在理解上,多态的形成就是建立在赋值兼容规则基础上的。
多继承
以上讲解都是建立在单继承上的。
一个子类有两个或两个以上直接父类时,就称这个继承是多继承。
多继承需要记住的点就是:
构造时,按顺序对父类进行构造,若有虚拟继承的父类,先构造虚拟继承的父类
菱形继承的问题和解决
多继承是复杂的,效率不高的。主要体现在菱形继承。一个图快速了解菱形继承:
菱形继承的缺点在于,在效率的角度,它是数据冗余的;站在安全的角度,他是数据二义的。
虚拟继承
虚拟继承可以解决菱形继承数据冗余和二义性的问题,要注意的是,虚拟继承不要在其他地方使用。
代码:
classA
public:
int_a;
//classB:publicA
classB:virtualpublicA
public:
int_b;
//classC:publicA
classC:virtualpublicA
public:
int_c;
classD:publicB,publicC
public:
int_d;
intmain()
Dd;
d.B::_a=1;
d.C::_a=2;
d._b=3;
d._c=4;
d._d=5;
return0;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论