C++继承

一.单继承

        继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保 持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象 程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继 承是类设计层次的复用

1.继承方式

        C++有三种继承方式,public继承,protected继承,private继承,实质就是让在基类的成员被派生类继承后访问方式的变化

这里的不可见指的是private成员被派生类继承后,无论是在类里面还是在类外都不能被访问

如果不写继承方式,class 修饰的类默认private继承,struct修饰的类默认public继承

2.派生类和基类的赋值兼容转换

        派生类对象 可以赋值给 基类的对象 / 基类的指针 / 基类的引用。这里有个形象的说法叫切片 或者切割。寓意把派生类中基类那部分切来赋值过去。

如上图也就是说,p指向的是a中基类的部分,r是a中基类部分的别名

3.作用域

        在继承体系中基类和派生类都有独立的作用域。如果基类和派生类有名字相同的成员,就构成隐藏关系,需要声明类域访问,需要注意的是如果是成员函数的隐藏,只需要函数名相同就构成隐藏。

4.派生类默认成员函数

        派生类的默认成员函数与普通类的默认成员函数相比,多了基类那一部分,原则是,派生类自己的部分自己处理,基类的那部分基类处理,比如构造

如果不写A类的构造函数,默认生成的会自动调用基类的构造函数,如何要初始化父类部分,就要调用父类的构造函数,先初始化基类部分,再初始化派生类部分,其他成员函数相同

注意:析构函数不需要显式调用基类的析构函数,因为作了特殊处理,为了防止基类析构后,又在派生类的析构函数里使用,所以当派生类析构函数调用后,会自动调用基类析构函数,析构函数是先子后父

5.友元

派生类不能继承基类的友元

6.静态成员

静态成员依然只有一份,被基类和派生类共享

二.多继承

一个类有两个以及两个以上的直接父类叫多继承

多继承其他东西与单继承差不多,主要是特殊的菱形继承

菱形继承

菱形继承的问题:从下面的对象成员模型构造,可以看出菱形继承有数据冗余和二义性的问题。

1.菱形虚拟继承

菱形虚拟继承就是为了解决菱形继承数据的问题

使用virtual关键字虚拟继承

virtual关键字加在导致数据二义性的类处,比如这里B,C类都有一个A类的成员,就会导致D类有两份A类的成员,使用virtual关键字后,D中A的部分就只会有一份

2.菱形虚拟继承的原理

这是一个普通菱形继承的内存分布,比如d的数据

可以看到,d里面有两份a

菱形虚拟继承后

原先a的位置好像变成了一块指针,而a好像到了最下面,现在我们来看这两个指针

这里面第一个数据是都是空,第一个指针指向的第二个数据是20,第二个指针指向的第二个数据是12

我们发现,这和到a的偏移量有关

当我们在外面访问a时,无论通过哪个域作用访问,都会通过偏移量访问到这个唯一的a,这就解决了多继承的数据冗余,这样A类的数据只会出现一份

我们把这个指针指向的数据叫虚基表

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值