c++复习之继承与派生
发布日期:2021-07-16 18:25:50 浏览次数:8 分类:技术文章

本文共 2325 字,大约阅读时间需要 7 分钟。

指的是类的继承与派生

概念

继承

类的派生指一个或多个以前定义的类产生新类的过程,原有的类称为基类,新产生的类称为派生类。

派生类不能继承基类的构造与析构函数。需要自己定义构造与析构函数。
派生类可改变基类访问成员的访问权限,重新定义已有的成员函数,增加新的成员。若定义了同名的成员,则派生类的成员优先。

定义格式:

class 派生类名:继承方式说明符 基类名{    类体}

继承方式说明符指如何控制基类成员在派生类中的访问属性,通常是public

类的大小

是基类成员变量所占用的空间+派生类对象自身成员变量占用的存储空间大小。与成员函数和类中的静态成员变量无关,空类的大小是1.

友元的继承

基类的成员函数是某类的友元函数,那么这个函数将会被继承仍是某类的友元函数。

静态成员

无论继承多少次,都只是同一内存空间,也就是内存空间共享。

派生类访问成员格式:

类名::<成员名>》

protected访问范围

可直接访问基类中的保护成员,还是不能访问私有成员。只能访问所作用的那个对象(即this指针指向的对象)的基类保护成员,不能访问其他基类对象的基类保护成员。

多重继承

一个派生类有多个基类

格式:

class 派生类名:: 继承方式说明符 基类名1,继承方式说明符 基类名2,...,继承方式说明符 基类名n{  类体;}

二义性问题

多个基类存在重名的成员,

解决:是在访问派生类对象中的某个变量上,加上“基类::”作为前缀

访问控制

公有继承,基类中所有公有成员将成为派生类的公有成员

在公有派生情况下,基类的公有或保护成员在派生类中访问权限不变

类兼容性规则

  • 派生类的对象可以赋值给基类的对象
  • 派生类对象可以用来初始化基类引用
  • 派生类的指针可以赋值给基类的指针,即基类指针指向派生类对象。
    反之,三条规则都不成立。

私有继承的访问

- 第一级派生类中 第二级派生类中 基类与派生类外
基类的公有成员 直接访问 不可访问 不可访问
基类的保护成员 直接访问 不可访问 不可访问
基类的私有成员 调用公有函数访问 不可访问 不可访问

说明:派生类私有继承时,基类中的所有公有和保护成员就成为了派生类的私有成员,所以下一级派生就不能继承了。

保护继承访问

  • 保护继承中,基类的公有成员和保护成员都以保护成员的身份出现在派生类中,而基类的私有成员不可以直接访问
  • 派生类的基他成员可以直接访问从基类继承来的公有和保护成员,但在类外通过派生类的对象无法直接访问它们。

派生类构造函数和析构函数

派生类不继承基类的构造函数,那么如何完成从基类继承成员的初始化呢?

需要在派生类的构造函数中调用基类的构造函数。

构造函数格式

派生类名::派生类函数名(参数表):基类名(基类初始化参数表),...,基类名m(初始化参数表),成员对象名(成员对象初始化参数表),...,成员对象名n(初始化参数表){派生类构造函数体;}

构造函数的执行次序

  1. 调用基类的构造函数,调用顺序按照它们被继承时声明的顺序(从左向右)
  2. 对派生类新增的成员变量,调用顺序按照它们在类中声明顺序执行
  3. 执行派生类中构造函数体中的内容

复制构造函数

对于一个类,没有定义复制构造函数,则编译器会自动生成一个隐含的复制构造函数,这个隐含的构造函数会自动调用基类的复制构造函数,从而对派生类中的新增的成员对象一一进行复制。

多重继承的构造与析构函数

当创建有多个基类的派生类对象时,按照类定义中给出的基类的顺序,依次调用它们的构造函数,再调用派用类的构造函数。消亡时,按构造函数调用的逆次序进行析构。

类之间的关系

使用已有类,可以继承 和组合 基类

封闭类的派生

构造函数的一般形式:

类名::函数名(形参表):内嵌对象(形参表),内嵌对象2(形参表),...{ 类体;}

封闭类的派生

  • 派生类也是封闭类时,调用构造函数的顺序是:先根据派生层次从上至下依次执行所有基类的构造函数,最后执行自身的构造函数。
    如果某个类是封闭类,则构造时,先按照成员对象定义顺序执行各个成员对象所属类的构造构造函数。
  • 派生类消亡时,也是逆序执行析构函数。

多层次派生

情形:类A派生类B,类B再派生类C,类C又派生类D,则A是B的直接基类,类B是类C的直接基类,类A是类C间接基类。类A也是类D的间接基类。

  • 定义这种派生类时,不需写间接基类,派生类沿着类的层次自动向上继承它所有的直接和间接基类成员。
  • 类成员之间的继承关系具有传递性
  • 所以派生类的成员包括:自已定义的成员、直接基类中定义的成员及所有间接基类中定义的全部成员。
  • 当生成派生类对象时,会从最顶层的基类开始逐层执行所有基类的构造函数,最后执行派生类自身的构造函数,消亡时会逆序执行析构。

基类与派生类指针的互相转换

  • 公有派生的情况下,3条兼容性规则
  • 基类的指针不能直接赋值给派生类的指针,但是通过强制类型转换,可以将基类指针强制转换成派生类指针后,再赋值给派生类指针。
  • 即使基类指针指向一个派生类的对象,也不能通过基类指针访问基类中没有而仅在派生类中定义的成员函数。
  • 如果一个指针是派生类型的,则调用的是派生类中的函数,如果派生类中没有声明,则调用从基类继承的同名函数。

  1. 继承关系,是 "is a"关系或是关系。指在公有继承的赋值兼容规则下,如果类B公有继承于A,在可以使用A的对象的任何地方,则类B对象同样也能使用,即每一个类B的对象“就是一个”类A对象,反之,不成立。需要类B对象,类A对象不能代替。

  2. 组合关系是“has a”或有关系,表现为封闭类,即一个类以另一个类的对象作为成员变量。如student包含一个data类对象

  3. 详见兼容性规则

转载地址:https://blog.csdn.net/guangod/article/details/118424869 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:无法将文件obj\Debug\*.exe复制到bin\Debug\*.exe,对路径“..\bin\*.exe”的访问被拒绝
下一篇:SourceInsight使用

发表评论

最新留言

逛到本站,mark一下
[***.202.152.39]2024年03月31日 23时36分23秒