继承与派生

1
2
3
class 派生类名: public 基类名 {
...
};
  • 派生类对象的内存空间

    • 派生类对象的体积等于基类对象的体积, 再加上派生类对象自己的成员变量的体积. 在派生类对象中, 包含着基类对象, 而且基类对象的存储位置位于派生类对象新增的成员变量之前
  • 派生类中和基类同名同参数表的方法 – 覆盖 (不是重载)

复合关系和继承关系

  • 复合关系

    • 类C中 “有” 成员变量k, k是类D的对象, 则C和D是复合关系
    • 一般逻辑上要求: D对象是C对象的固有属性或组成部分
    • 不能循环定义(我中有你, 你中有我)

基类/派生类同名成员和protected访问范围说明符

  • 基类的 private成员 可被下列函数访问

    • 基类的成员函数
    • 基类的友元函数
  • 基类的 public成员 可被下列函数访问

    • 基类的成员函数
    • 基类的友元函数
    • 派生类的成员函数
    • 派生类的友元函数
    • 其他函数
  • 基类的 protected成员 可被下列函数访问

    • 基类的成员函数

    • 基类的友元函数

    • 派生类的成员函数可以访问当前对象的基类的保护成员 (绕)

      image-20250120222136388 image-20250120222143420

派生类的构造函数

  • 派生类对象包含基类对象

  • 执行派生类构造函数之前, 先执行基类的构造函数

  • 派生类交代基类初始化

    1
    2
    3
    构造函数名(形参表): 基类名(基类构造函数实参表) {
    ...
    }
  • 调用基类构造函数的两种方法

    • 显式方式
      • 如上
    • 隐式方式
      • 派生类的构造函数中, 省略基类构造函数时
      • 派生类的构造函数, 自动调用基类的默认构造函数
  • 派生类的析构函数被执行时, 执行完派生类的析构函数后, 自动调用基类的析构函数

  • 派生类包含成员对象时, 先执行基类构造函数, 再执行成员对象类构造函数, 最后执行自己的构造函数

  • 析构函数调用顺序相反

public继承的赋值兼容规则

  • public继承下

    • 派生类对象可以赋值给基类对象

    • 派生类对象可以初始化基类引用

    • 派生类对象的地址可以赋值给基类指针