1 引入:继承和派生
- 继承:在定义一个新类B时,若B拥有A的全部特点,则把A作为一个基类,把B作为基类的一个派生类(或称为子类)。
- 定义:class 派生类名:public 基类名 { //code };
1.1 派生类的构造函数
调用派生类时先执行基类的构造函数
派生类初始化:
构造函数名(形参表):基类名(基类构造函数实参表){}
派生类构造函数中省略基类构造函数时,将自动调用基类构造函数
1.2 public继承赋值兼容规则
定义一个基类对象 base b和一个派生类对象 derived d:
- 派生类对象可赋值给基类对象 (b = d)
- 派生类对象可初始化基类引用 (base &br = d)
- 派生类对象地址可赋值给基类指针 (base *pb = &d)
2 虚函数及多态
2.1 虚函数的定义
类定义里,前有 virtual关键字的成员函数称为 虚函数(构造函数和静态成员函数不能是虚函数)
2.2 多态的表现形式
- 1、<派生类的对象地址可以赋值给基类指针> 通过基类指针调用基类和派生类中的同名虚函数时,若该指针指向一个基类对象(派生类对象),那么被调用的是基类(派生类)虚函数。派生类的对象地址可以赋值给基类指针>
- 2、<派生类的对象可以赋值给基类引用> 通过基类引用调用基类和派生类中的同名虚函数时,若该引用引用的是一个基类对象(派生类对象),那么被调用的是基类(派生类)虚函数。 下面以一个简单的例子来说明:派生类的对象可以赋值给基类引用>
2.3 多态实现原理
- 动态联编
- 虚函数表 每一个有虚函数的的类(及其派生类)都有个虚函数表。该类任何对象中都存放着虚函数表的指针
- 目的:提高程序的可扩充性(但有额外空间时间上的开销,主要体现在每个对象多4个字节存储以及查虚函数表上)