C/C++编程笔记:C++入门知识丨继承和派生
本篇要学习的内容和知识结构概览

继承和派生的概念
派生
通过特殊化已有的类来建立新类的过程, 叫做”类的派生”, 原有的类叫做”基类”, 新建立的类叫做”派生类”. 从类的成员角度看, 派生类自动地将基类的所有成员作为自己的成员, 这叫做”继承”. 基类和派生类也可以叫做”父类”和”子类”, 也可以叫做”一般类”和”特殊类”.
继承
类的继承是指派生类继承基类的数据成员和成员函数. 继承用来表示类属关系, 不能将继承理解为构成关系
继承派生的作用
(1)增加新的成员(数据成员和成员函数)
(2)重新定义已有的成员函数
(3)改变基类成员的访问权限
单一继承
一般形式:class 派生类名: 访问控制 基类名 { private: 成员声明列表 protected: 成员声明列表 public: 成员声明列表}
"冒号"表示新类是哪个基类的派生类
"访问控制"指继承方式. 三个方式: public, protected, private
派生类的构造函数和析构函数


类的保护成员
如果希望Rect中的showRect()函数可以一次显示x, y , w, h. 我们直接修改showRect()函数是不行的。

报错 error: 'x' is a private member of ‘Point' 'y' is a private member of ‘Point', x, y为Point类的私有成员, 公有派生时, 在Rect类中是不可访问的
我们还需要将基类Point中的两个成员声明为protected的属性
像这样:


访问权限和赋值兼容规则
在根类中, 对于成员的访问级别有三种, public, protected, private
在派生类中, 对于成员的访问级别有四种, public(公有), protected(受保护), private(私有), inaccessible(不可访问)
(1)公有派生和赋值兼容规则
在公有派生情况下, 基类成员的访问权限在派生类中基本保持不变
1.基类的公有成员在派生类中仍然是公有的
2.基类的保护成员在派生类中仍然是受保护的
3.基类的不可访问的成员在派生类中仍然是不可访问的
4.基类的私有成员在派生类中变成了不可访问的
总结: 在公有派生的情况下, 通过派生类自己的成员函数可以访问继承过来的公有和保护成员, 但是不能访问继承来的私有成员, 因为继承过程的私有成员, 变成了第四个级别, 不可访问的.
赋值兼容规则:在公有派生的情况下, 一个派生类的对象可以作为基类的对象来使用的情况.
像这样:


(2)“isa”和”has-a“的区别
继承和派生 isa
比如一个Person类, 派生出一个Student类, 我们可以说Student就是Person, 也就是 Student isa Person, 而反过来则不行.
一个类用另一个类的对象作为自己的数据成员或者成员函数的参数 has-a
像这样:

表示一个Worker对象有一个名字, 一个地址, 一个电话号码, has-a的关系, 包含的关系
(3)私有派生
通过私有派生, 基类的私有和不可访问成员在派生类中是不可访问的, 而公有和保护成员这里就成了派生类的私有成员


因为私有派生不利于进一步派生, 因而实际中私有派生用得并不多
(4)保护派生
保护派生使原来的权限都降一级使用, 即private变为不可访问, protected变为private, public变为protected. 限制了数据成员和成员函数的访问权限, 因此在实际中保护派生用得也不多.
比如: 我们在上个例子中, Rect类保护派生于Point, 则在Test类中Point::show();就可以使用啦!
多重继承
一个类从多个基类派生
格式:
class 派生类名: 访问控制 基类名1, 访问控制 基类名2, … {
定义派生类自己的成员
}
像这样:


二义性及其支配规则
对基类成员的访问必须是无二义性的, 如果一个表达式的含义可以解释为可以访问多个基类中的成员, 则这种对基类成员的访问就是不确定的, 称这种访问具有二义性
作用域分辨符和成员名限定



格式:类名::标识符
:: 为作用域分辨符, "类名"可以是任一基类或派生类名, “标识符”是该类中声明的任一成员名
派生类支配基类的同名函数
如果派生类定义了一个同基类成员函数同名的新成员函数(具有相同参数表的成员函数), 派生类的新成员函数就覆盖了基类的同名成员函数.
在这里, 直接使用成员名只能访问派生类中的成员函数, 使用作用域运算符, 才能访问基类的同名成员函数.
派生类中的成员函数名支配基类中的同名的成员函数名, 这称为名字支配规则.
如果一个名字支配另一个名字, 则二者之间不存在二义性, 当选择该名字时, 使用支配者的名字.
例如上个例子中

来自一张表的总结

总结
C++中的多重继承可能更灵活, 并且支持三种派生方式, 我们在学习一门语言的时候, 更应该把精力放在它的特性上面, 不应该用什么语言, 都用自己所擅长语言的思考方式, 实现方式等, 要学会发挥该语言的优势所在。
自学C/C++编程难度很大,不妨和一些志同道合的小伙伴一起学习成长!

另外,UP在主页上传了一些学习C/C++编程的视频教程,有兴趣或者正在学习的小伙伴一定要去看一看哦!会对你有帮助的~