一、基础概念
 
1. 继承(派生):在已有类(基类/父类)基础上建立新类(派生类/子类),复用原有代码,实现代码复用。
2. 基类:被继承的类;派生类:继承得到的新类。
3. 格式
 
cpp
  
class 派生类名 : 继承方式 基类名
{
    新增成员;
};
 
 
4. 三种继承方式: public 、 protected 、 private 
 
访问权限变化(重点)
 
基类成员 public继承 protected继承 private继承 
public public protected private 
protected protected protected private 
private 不可直接访问 不可直接访问 不可直接访问 
 
关键点:基类私有成员,无论何种继承,派生类都不能直接访问,只能调用基类公有、保护成员函数访问。
 
二、三种继承详细说明
 
1. public 公有继承(最常用)
 
- 基类public→派生类public,基类protected→派生类protected
- 外部只能访问继承来的public成员,protected仅类内、子类可用。
 
2. protected 保护继承
‑ 继承之后原公有、保护成员全部变成派生类的protected。外部对象无法访问。
3. private 私有继承
‑ 继承后全部变为private,再次派生时,下一级子类无法继承到这些成员。
 
默认继承方式:class默认private继承;struct默认public继承。
 
三、派生类的构造函数与析构函数
 
1. 构造函数
 
派生类构造函数不会自动调用基类构造函数,必须显式初始化。
语法:
 
cpp
  
派生类(参数列表):基类(实参),成员对象(实参)
{
}
 
 
- 执行顺序:先基类构造 → 成员对象构造 → 派生类自身构造
- 如果不写基类调用,自动调用基类无参构造。基类只有带参构造时,派生类必须显式传参。
 
2. 析构函数
 
- 析构不能显式调用父类析构,系统自动执行
- 执行顺序:派生类析构 → 成员对象析构 → 基类析构,和构造顺序相反
 
四、同名成员隐藏(覆盖)
 
1. 派生类和基类成员重名,派生类成员会隐藏基类同名成员。
2. 子类内访问子类成员;想要访问被隐藏的基类成员,要加作用域:
 
cpp
  
对象.基类::成员;
 
 
3. 函数同名:普通同名隐藏,不属于多态,没有虚函数时只发生静态覆盖。
 
五、访问基类私有成员方式
 
1. 基类提供public/protected的get、set成员函数,子类调用。
2. 友元:友元不能被继承。
 
六、多重继承
 
1. 一个派生类同时继承多个基类,逗号隔开。
 
cpp
  
class D:public A,public B
{};
 
 
2. 构造顺序:按照继承列表从左到右依次构造基类,跟初始化列表顺序无关。
3. 二义性问题:多个父类含有同名成员,直接调用会报错,必须加类名限定。
 
七、菱形继承(冗余数据、二义性)
 
1. 问题:公共祖先被重复继承,产生多份副本,占用内存并且访问产生歧义。
2. 解决方案:虚继承 virtual public
 
cpp
  
class B:virtual public A{};
class C:virtual public A{};
class D:public B,public C{};
 
 
虚继承只会保留一份A的数据,解决数据冗余。
 
八、protected 访问属性的意义
 
1. public成员:外界可以随意修改,不安全。
2. private成员:子类无法直接使用,不方便扩展。
3. protected:类内部以及派生类可以直接使用,外部禁止访问,专门服务于继承。
 
九、重要易错点总结
 
1. 继承只会继承成员变量和成员函数,构造、析构、运算符重载、友元不能被继承。
2. 继承方式只决定子类向外暴露的权限,子类内部永远可以访问基类public、protected。
3. 私有继承之后,后续再派生,上一层继承来的数据无法继续向下传递。
4. 派生类新增成员,只能在派生类函数里使用,基类无法访问子类独有的成员。

更多推荐