1.继承的概念及定义
1.1继承的概念
继承 (inheritance) 机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。
继承的本质是复用,比如你需要定义好几个类,但是这几个类有相当一部分的成员都是 重复的,此时就应该想到怎么 复用这一重复的部分,即写一个父类
例如:一个外卖平台有 骑手、商家、客户 三种类
这三种类都有 相同的几种成员,显得有点重复
此时就可以利用 继承,定义一个 父类,骑手、商家、客户 三种类 直接继承 那个基础的类(即父类),实现复用(就和函数复用差不多,当几个函数都有相同的程序步骤,可以直接封装成一个新函数,那几个函数直接复用这个新函数就行,增加可读性,减少代码量)
⭐多个类继承同一个父类 只是拷贝新的一份父类的成员变量到子类,父类的成员函数 共用同一个
因为在一个类对象的存储上来讲,成员函数本来就不属于一个类,而是放到公共代码区,供所有该类的对象复用
1.2 继承定义
1.2.1定义格式
下面我们看到 Person 是父类,也称作基类。Student是子类,也称作派生类。
Student 具有人的基础信息,则定义成父类,直接继承父类就好
// 父类:一个人的基础信息 class Person { public: Person(){} string _name = "peter"; // 姓名 protected: int _age = 18; // 年龄 private: //父类定义本质,不想被子类继承 int _tel = 110; }; // 子类:继承的父类的成员 class Student : public Person { protected: int _stuid; // 学号:学生类的特殊成员 };
1.2.2 继承关系和访问限定符
继承方式:顾名思义,以什么方式继承一个父类
访问限定符:就是之前讲过的,一个类中设置的 访问限定
1.2.3 继承基类成员访问方式的变化
这个表格的核心点:基类的 private 成员是在 子类中无论以什么继承方式继承, 都是不能被访问的的
注意:只是不能访问这个 private 成员,而不是没有被继承到子类里面
通俗解释:你爸爸继承了家族产业给你,但是你爸还是有自己的私房钱,你可以使用家族产业,但你不能使用 你爸的私房钱(即你是知道有这部分私房钱的,但是你不能使用,就像 子类确实有继承到父类的私有成员,但是不能访问)
那有无方式访问到 父类的 私有成员?
通过调用父类的成员函数,间接的访问 父类的 私有成员
(1)精华总结 相关性质:
1、 基类 private 成员在派生类中无论以什么方式继承都是不可见的。这里的不可见是指基类的私 有成员还是被继承到了派生类对象中,但是语法上限制派生类对象不管在类里面还是类外面 都不能去访问它。
2、基类 private 成员在派生类中是不能被访问,如果基类成员不想在类外直接被访问,但需要在 派生类中能访问,就定义为protected。可以看出保护成员限定符是因继承才出现的。
小结:一个基类不想要 外界 和 子类 访问的成员,就写成 private;如果不想要 外界访问,但是允许子类访问,就写成 protected
3、父类的其他成员在子类的访问方式 等价于 Min(成员在基类的访问限定符,继承方式),public > protected > private。
(即 成员在基类的访问限定符 和 继承方式,取级别小的那个, 因为 private 最小,因此无论 继承方式是什么,最终 子类的对父类成员的访问方式都是 private的)
4、使用关键字 class 时默认的继承方式是private,使用 struct 时默认的继承方式是 public,不过 最好显式的写出继承方式。
即可以不显式写 继承方式,class 默认 private,struct 默认 public
class Student : Person // 默认 private 继承 struct Student : Person // 默认 public 继承
5、不同的继承方式有什么意义:若子类 私有 private 的 继承一个 父类,则这个父类的继承下来的所有成员都变成这个子类的 私有成员(包括成员变量);
其他的同理:若子类 公有的 继承一个 父类,则以优先级取小的原则,父类的 公有成员 变成 子类的公有,父类的 保护成员 变成 子类的 保护
6、在实际运用中一般使用都是 public 继承,几乎很少使用 protetced/private 继承,也不提倡 使用protetced/private继承,因为 protetced/private 继承下来的成