c++继承

概念

继承机制是面向对象设计使用复用的最重要手段,允许在保持原有特性的基础上进行扩展,增加功能,这样产生新的类,叫派生类

用法

1基类private成员在派生类中无论以什么方式继承都是不可见的,这里的不可见是指基类的私有成员还是被继承到了派生类对象中,但是语法上限制派生类对象不管在类里面还是在类外面都不能去访问它

2基类private成员在派生类中是不能被访问,如果基类成员不想在类外面直接被访问,但需要在派生类中中能访问,就定义为protected

3基类的私有成员在子类都是不可见,基类的其他成员在子类的访问方式是MIN(成员在基类的访问限定符,继承方式 )

切割/切片

注意基类对象不能赋值给派生类对象

切片不存在类型转换,是语法天然支持的

隐藏/重定义

在继承体系中基类和派生类都有独立的作用域

成员函数只要函数名相同就构成隐藏,子类和父类中有同名成员,子类成员将屏蔽父类对同名成员的直接访问,这种情况叫隐藏

派生类的默认构造函数

我们不写默认生成的派生的构造和析构,拷贝构造和oerator=

a.父类继承下来的就调用父类构造和析构,拷贝构造和oerator=处理 b.自己的(内置类型和自定义类型成员)就和普通类一样

总结就是:继承下来的按照父类的来处理,自己的按照类基本规则处理

以下情况必须自己写:

1,父类没有默认构造函数,,需要自己显示写构造

2,子类需要资源释放,需要显示写析构

3,子类存在浅拷贝问题要自己实现拷贝构造和赋值重载解决浅拷贝

自己如何写:

父类成员调用父类的对应构造,拷贝构造,operator=和析构,自己成员按照普通类处理

析构函数名字会被统一处理成destructor(),那么子类的析构函数会和父类的析构函数构成隐藏

子类析构函数结束时会自动调用父类的析构函数(原因:保证了先析构子类再析构父类)

继承与友元和static成员

友元关系不能继承

基类定义了一个static静态成员,则整个继承体系中只有一个这样的成员

多继承

菱形继承的问题:二义性,数据冗余

Assistant继承的是student和teacher,而student和teacher都继承了person,因此student和teacher中都会有name成员。直接访问Assistant成员,编译器不知道调用哪一个name成员,而且student和teacher都存有name成员变量会导致name存两份,造成数据冗余

解决方法:虚继承

对中间部分使用虚继承即可

此时就可以直接使用Assistant中的name对象了,解决了二义性问题

总结:多继承就是c++中的一个坑,现实中基本用不上,不建议使用多继承

继承和组合

继承:上述所说。每一个派生类对象都是一个基类对象is-a
组合:在一个类里面包含另外一个类的对象成员。每一个B对象中都包含了一个A has-a;比如我们在自己的类中使用std::string,此时我们自己的类和std::string的关系就是组合
组合是黑盒复用,继承是百盒复用(子类能知道父类的细节,称为白盒)

实际情况中,建议优先选择组合,而不是继承。

继承增加了代码的复用性,但是在一定程度上破坏了基类的封装性。派生类和基类的关联很强,耦合度高。
对象组合是另外一种复用的选择,这时候,对象A的内部结构是不得而知的。这样就减小了对象之间的关联性,耦合度低,保护了封装,更方便代码的维护
不过,继承还有另外一种用途,那就是多态。我们下边会讲解的!

在软件设计中,追求高内聚,低耦合,不同模块之间的关联度应该竟可能的低。在设计类间关系,和不同功能模块的时候,需要考虑具体场景来进行继承和组合的选用。

比如A继承B,此时两个类就被强关联在一起了,耦合度相对较高。对父类A的任何修改i,都会影响达到B,甚至导致B无法正常运行。


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值