第01讲 继承和派生的基本概念、单一继承

6.1 继承和派生的基本概念

  继承关系是类与类之间的类属关系
  类:人
  类:学生
  类:教师
  在已有类的基础上定义新的类称为类的派生,新产生的类为派生类,原来的类为基类。
  (一般与特殊的关系)
  继承关系是类与类之间的类属关系
  类:人
  类:学生
  类:教师
  从成员构成来看,派生类具有基类的所有成员,基类又叫父类,派生类又叫子类。
  类的继承是指:派生类继承基类的所有数据成员和成员函数。用于表示类间的类属关系。非构成关系。
  派生类的特点:
  1.增加新成员。
  2.重定义已有成员函数。
  3.改变基类的成员的访问权限。
  姓名、年龄、性别。。。。
  第六章 继承和派生 - 图1

6.2 单一继承

6.2.1一般形式

  class 派生类名:访问控制 基类名
  { private:
  成员列表;
  public:
  成员列表;
  protected:
  成员列表;
  };

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

  派生类中继承的基类的成员初始化时,需要由派生类的构造函数调用基类的构造函数。
  派生类的构造函数一般形式:
  派生类名::派生类名(参数):基类名(参数)
  {
  //函数体
  }
  构造函数和析构函数不能被继承。
  类的派生实例
  有类human对象用于存放人的相关信息:
  姓名,年龄,性别
  并能利用成员函数实现相关信息输出。
  在此基础上定义类student类,具有学号、班级信息,并能完成信息的输出显示。
  定义类,并设计测试程序。
  第六章 继承和派生 - 图2
  第六章 继承和派生 - 图3
  第六章 继承和派生 - 图4
  运行结果:
  人 李斯 诞生了
  学生 1001 诞生了
  my name is 李斯
  my age is 20
  ma sex is 女
  my num is 1001
  my class is 07信1
  学生 1001 over
  人 李斯 over 了
  Press any key to continue
  问题:在student类中能否直接使用human类中的name,sex,age等成员??
  第六章 继承和派生 - 图5
  此时程序无法运行!!!!!
  第六章 继承和派生 - 图6
  第六章 继承和派生 - 图7
  类A定义中由private限定的成员只能在类A中使用。
  student虽然是human的派生类也不可使用human类中的private成员,所以在student中定义的show函数不可使用human中的name,sex,age等私有成员。

6.2.3类的保护成员protected

  第六章 继承和派生 - 图8
  第六章 继承和派生 - 图9
  公有派生得到的派生类不能使用基类的私有成员。
  那么如何解决派生类中访问基类的成员呢?并且不能打破封装性:基类的对象仍不可使用这些成员。
  6.2.3类的保护成员protected
  第六章 继承和派生 - 图10
  第六章 继承和派生 - 图11
  公有派生得到的派生类不能使用基类的私有成员。
  protected限定的成员具有公有和私有双重性质。
  该类成员在派生类中可访问,其他非成员函数不可访问。
  6.2.3类的保护成员protected
  第六章 继承和派生 - 图12
  第六章 继承和派生 - 图13
  第六章 继承和派生 - 图14
  第六章 继承和派生 - 图15
  第六章 继承和派生 - 图16
  人 李斯 诞生了
  学生 李斯 诞生了
  my name is 李斯
  my age is 20
  my sex is 女
  my num is 1001
  my class is 07信1
  学生 李斯 over
  人 李斯 over 了
  Press any key to continue
  第六章 继承和派生 - 图17
  公有派生得到的派生类不能使用基类的私有成员。
  protected限定的成员具有公有和私有双重性质
  该类成员在派生类中可访问,其他函数不可访问。
  复习上节
  基类、派生类、继承
  派生类的特点:
  1.增加新成员
  2.重定义已有函数
  3.改变成员访问权限
  派生类的定义形式:
  class 派生类名:访问控制 基类名
  { private:
  成员列表;
  public:
  成员列表;
  protected:
  成员列表;
  };
  第六章 继承和派生 - 图18
  派生类的定义形式:
  公有派生的特点:
  派生类中可访问基类中的protected成员
  派生类中可访问基类中的public成员
  派生类中不可访问基类中的private成员
  公有派生和保护成员
  protected限定的成员具有公有和私有双重性质
  在基类中是私有的,在派生类中可访问。
  问题:
  1.基类的对象是否可访问protected成员?
  2.派生类的对象是否可访问公有派生类中继承自基类的protected成员?
  3.基类的成员函数是否可访问基类中的protected成员?
  4.派生类的成员函数是否可访问公有派生类中继承自基类的protected成员?
  派生类的构造函数和析构函数:
  派生类的构造函数不能由基类继承而得
  派生类的构造函数一般形式:
  派生类名::派生类名(参数):基类名(参数)
  {
  //函数体
  }
  派生类的构造函数和析构函数:
  当产生一个派生类对象时,首先调用基类的构造函数,然后调用派生类的构造函数。
  当释放一个派生类对象时,首先调用派生类的析构函数,然后调用基类的析构函数。
  6.2.3类的保护成员protected
  第六章 继承和派生 - 图19
  第六章 继承和派生 - 图20

6.2.4访问权限和赋值兼容规则

  1.公有派生和赋值兼容规则
  a,基类的公有成员在派生类中仍是公有的。
  b,基类的保护成员在派生类中仍是保护的。
  c,基类的私有成员在派生类中是不可访问的。
  d,基类的不可访问成员在派生类中仍不可访问。
  什么是类的不可访问成员????
  例如:若human类中name是private的,
  则,student类不可访问
  若student做某个类A的基类时,类A仍不可访问name
  基类对象和派生类对象的相互赋值。
  每个学生都是人。
  说明:student类的每个对象都是human类的对象。
  每个人不一定是学生。
  说明:human类的每个对象不一定是student类的对象。
  基类对象和派生类对象的相互赋值。
  每个学生都是人。
  说明:student类的每个对象都是human类的对象。
  a,派生类的对象可赋值给基类的对象。
  b,派生类的对象可以初始化基类的引用
  c,派生类的对象地址可赋值给基类的指针
  此时基类的引用或指针只能访问派生类中继承自基类的成员。
  a,派生类的对象可赋值给基类的对象。
  b,派生类的对象可以初始化基类的引用
  c,派生类的对象地址可赋值给基类的指针
  第六章 继承和派生 - 图21
  此时基类的对象、引用或指针只能访问派生类中继承自原基类的成员。
  人  李斯  诞生了
  学生 李斯  诞生了
  人  张三  诞生了
  my  name is 李斯
  my  age is  20
  my  sex is  女
  人  张三 over 了
  学生 李斯 over
  人  李斯 over 了
  Press any key to continue
  2.isa和has-a的区别
  类与类间的关系:
  isa关系: 继承和派生关系。
  has-a关系: 一个类使用另一个类的对象作成员
  一般来说:公有继承关系和isa关系是等价的。
  但某些情况下: 企鹅是鸟
  鸟会飞
  企鹅会飞吗?
  对象作成员表示has-a关系
  3.公有继承存取权限表
  什么是公有继承?????
  基类 private public protected
  派生类 不可访问 public protected
  基类对象 不可访问 可访问 不可访问
  派生类对象 不可访问 可访问 不可访问
  4.私有派生
  定义派生类时,用private限定
  class 派生类名:private 基类名
  { private:
  成员列表;
  public:
  成员列表;
  protected:
  成员列表;
  };
  定义派生类时,用private限定
  基类的私有成员和不可访问成员在派生类中不可访问
  基类的公有成员和保护成员变为私有成员
  假定有基类:base
  第六章 继承和派生 - 图22
  定义派生类时,用private限定
  第六章 继承和派生 - 图23
  问题:
  第六章 继承和派生 - 图24
  第六章 继承和派生 - 图25
  问题:d对象是否可以使用fun1函数??
  基类的私有成员和不可访问成员在派生类中不可访问
  基类的公有成员和保护成员变为私有成员
  派生类的对象不可访问继承自基类的所有成员,派生类的成员函数可访问继承自基类的protected成员和public成员
  5,保护派生
  定义派生类时,用protected限定
  降级使用
  基类中的private变为不可访问
  protect变为private
  public 变为protected
  第六章 继承和派生 - 图26
  第六章 继承和派生 - 图27
  降级使用
  基类中的private变为不可访问
  protected变为private
  public 变为protected
  第六章 继承和派生 - 图28

第02讲 多重继承、二义性及其支配规则  

6.3 多重继承

  一般形式:
  class 类1:访问控制 类2, 访问控制 类3
  {
  private:
  //私有成员
  protected:
  //保护成员
  public:
  //公有成员
  }
  第六章 继承和派生 - 图29
  第六章 继承和派生 - 图30
  第六章 继承和派生 - 图31
  第六章 继承和派生 - 图32
  多重继承中成员访问权限的变化同单一继承!
  以下访问是指在派生类的成员函数中使用成员
  公有派生:
  基类的private成员在派生类中可否访问?
  基类的protected成员在派生类中可否访问?
  基类的public成员在派生类中可否访问?
  私有派生:
  基类的private成员在派生类中可否访问?
  基类的protected成员在派生类中可否访问?
  基类的public成员在派生类中可否访问?
  多重继承中成员访问权限的变化同单一继承!
  保护派生:
  基类的private成员在派生类中可否访问?
  基类的protected成员在派生类中可否访问?
  基类的public成员在派生类中可否访问?
  

6.4 二义性及其支配规则

6.4.1作用域分辨符和成员名限定

  第六章 继承和派生 - 图33
  第六章 继承和派生 - 图34
  第六章 继承和派生 - 图35
  第六章 继承和派生 - 图36
  当派生类中从多个基类中继承得到同名函数时,在派生类中使用这些函数时,须使用类名限定!
  派生类的对象使用这些函数时,也需要进行类名限定!
  类名::成员名

6.4.2派生类支配基类的同名函数

  第六章 继承和派生 - 图37
  第六章 继承和派生 - 图38
  第六章 继承和派生 - 图39
  第六章 继承和派生 - 图40
  第六章 继承和派生 - 图41
  C++的支配规则:
  ★在基类和派生类有重名的成员时,优先派生类的成员如果要访问基类成员,必须加上作用域符::
  ★私有(private)成员派生类不可以访问,只有本类和友类可以访问
  ★如果派生类要访问基类的成员,基类成员应该用protected限定。
  另注意:
  第六章 继承和派生 - 图42
  一个类B不能从类A直接继承2或2次以上
  第六章复习总结
  类的单一公有继承、单一私有继承、单一保护继承、多重继承 规则
  派生类的构造函数定义形式,及调用顺序
  派生类的析构函数调用顺序。
  protected成员
  派生类和基类对象的赋值兼容规则
  二义性及其支配规则(作用域限定)