继承基本语法
继承的本质也是用于封装抽象,将共同的属性抽取出来,其各种子类实现就不用写重复代码,其中父类也叫做基类,子类也叫做派生类。格式class 子类名:继承方式 父类

如上,我们定义动物类,然后定义动物通用方法,然后cat类继承,可以调用父类的方法,这里需要在继承格式里加上继承方式
继承方式
我们前面讲了类继承的格式,对于继承的类名冒号没什么说的,重点是继承的方式我们没有细讲,这次我们好好分解,先看下图

如上,类A分别有3种权限的属性,我们说过private属性子类不能继承,所以可以看到c三种模式都不可以继承,如果是public继承,则其他2种非private属性权限不变子类继承,如果是protest继承,则除private其他权限都变成protected给子类继承,如果是私有继承,则所有属性都变成子类的私有属性
继承中的对象模型

如上,我们创建A类,3种权限的属性,我们B类继承A,然后自身还有额外的属性,我们尝试输出B实例的大小,会是多少呢,有人会以为A中的private属性不继承,事实上,看结果也会知道,B会把A的属性全部继承过去,只是private无法访问而已,所以结果是4个int的16。

当然,我们还可以使用VS自带的工具去查看,我们开始菜单点开选开发人员命令提示符

然后我们选择cpp的目录,右键复制路径,然后在界面里切换到路径下dir,可以看到我们的程序文件

如上,我们的demo.cpp就在这里

然后指向cl /d1 reportSingleClassLayoutBbb demo.cpp。可以看到Bbb的层级,a,b,c属性是Aaa继承过来的,d为自身的,一共大小16字节。这里语句是报告单类然后加上类名,因为开始的A,B会提示一堆,我给2个类都重起了名字
继承中构造和析构的顺序
子类也会继承父类的构造方法,那问题来了子类实例到释放,到底是先执行谁的构造方法,先执行谁的析构方法

从上面可以明显看出,先有父类构造,再有子类构造,然后析构和构造顺序相反(顺序相反之前讲过)
继承中重名对象的处理方式

如上,我们定义了Base基类和Son子类,我们都有属性m_Age,初始都有构造方法,我们输出属性值,可以看到其值为200,表示值为子类的,当然子类.表示子类的属性,但是我们想获得父类的属性呢,就需要使用专门的作用域

如上,我们需要使用 子类对象.父类名::s属性 可访问到父类同名的属性。同样,我们还可以访问父类的同名方法

当然同名不是这么简单就使用了,有需要注意的地方

如上,我们在父类里定义了func的重载,但是子类只有无参的实现,我们想象中会调用成功func使用带参数的,实际却报错了,这是因为子类的重名方法默认会隐藏父类方法,我们这时候只有使用作用域才能实现调用

如上,明确了是调用父类的方法
重名静态成员变量继承
重名静态成员处理和之前一样,都是父类的使用作用域,子类的直接使用。

如上,我们可以看到通过对象的调用,当然静态成员是编译时就存在了,随类走不随对象。我们还可以通过类名调用

如上,我们可以看到类名访问静态方法需要使用::作用域,而不是点. 当然父类的也是使用了双重::

当然我们还可以通过工具去查看下结构
多继承语法
一个子类继承多个父类,如老鹰继承自鸟类和食肉动物,多继承可能会导致重名属性的访问问题,一般c++不建议使用多继承,虽然可以使用作用域区分调用父类的何成员
格式 class 子类名: 继承方式1 父类名1,继承方式2,父类名2

如上,我们两个类都有重名属性,然后基类都继承,结果我们访问这个重名属性就提示不明确,不知道该是哪个父类的值。

加上作用域就不会乱了,明确使用哪个父类的属性
菱形继承

菱形继承如上,羊,驼继承自动物,羊驼又继承自他们2个,如果有自动物继承过来的属性m_Age,留2份属性好像有点多余,只留一份属性

如上,我们定义了相关类,都有属性,然后子类实例去获得值,结果菱形继承导致羊驼实例不知道属性该继承自哪里

我们可以通过讲过的c++开发命令行去查看类的结构,也可以看到提示不知道属性该继承自哪个
我们想不重复继承属性,需要如何操作呢,这就需要使用虚继承,方法是在继承方式前加virtual,使用后,父类变成虚基类。

我们先将父类继承过来的属性设置,需要加上作用域才能修改如上,也得靠作用域区分继承的属性,但是还不能通过.访问。

当我们在继承方式前加上virtual就变成了虚继承,可以看到我们可以使用点来访问,而且通过任意继承过来的值设置和自身的值都一样,相当于修改了一个区域的值。我们还是使用vs工具来看看结构

如上,我们可以看到虚继承后2个父类羊和驼分别只有vbptr,这个就是virtual base pointer虚基类指针,他指向的就是vbtable虚基类表,比如说羊的表,下面可以看到指向了羊驼相关的地方,偏移量是8个字节去找Animal的顺序,而驼则是4个字节,所以羊驼本身的属性还是还是Animal的属性,指向都是一个地方
网友评论