一 继承关系举例
万事万物中皆有继承,是重要的现象
两个案例:1)植物继承图;2)程序员继承图
继承相关概念
派生类的定义
注意:C++中的继承方式(public、private、protected)会影响子类的对外访问属性。
继承重要说明
1、子类拥有父类的所有成员变量和成员函数
2、子类可以拥有父类没有的方法和属性
3、子类就是一种特殊的父类
4、子类对象可以当作父类对象使用
派生类的访问控制
- 不同的继承方式会改变继承成员的访问属性
1)C++中的继承方式会影响子类的对外访问属性
public继承:父类成员在子类中保持原有访问级别
private继承:父类成员在子类中变为private成员
protected继承:
父类中public成员会变成protected
父类中protected成员仍然为protected
父类中private成员仍然为private
- “三看”原则
C++中的继承方式(public、private、protected)会影响子类的对外访问属性
判断某一句话,能否被访问
1)看调用语句,这句话写在子类的内部、外部
2)看子类如何从父类继承(public、private、protected)
3)看父类中的访问级别(public、private、protected)
二 继承中的构造和析构
1. 类型兼容性原则
子类对象可以当作父类对象使用
子类对象可以直接赋值给父类对象
子类对象可以直接初始化父类对象
父类指针可以直接指向子类对象
父类引用可以直接引用子类对象
在替代之后,派生类对象就可以作为基类的对象使用,但是只能使用从基类继承的成员。
类型兼容规则是多态性的重要基础之一。
*总结:子类就是特殊的父类 (base p = &child;)
主要应用:父类指针做参数,调用子类成员函数,贯穿多态
//分别定义父类对象 父类指针 父类引用 child
Parent03 parent = child03;//子类赋值父类
Parent03 *pp = &child03;//父类指针指向子类对象
Parent03 &rp = child03;//父类引用引用子类对象
2. 继承中的对象模型
类在C++编译器的内部可以理解为结构体
子类是由父类成员叠加子类新成员得到的
3 继承中构造和析构
问题:如何初始化父类成员?父类与子类的构造函数有什么关系
在子类对象构造时,需要调用父类构造函数对其继承得来的成员进行初始化
在子类对象析构时,需要调用父类析构函数对其继承得来的成员进行清理
4. 继承中的构造析构调用原则
1、子类对象在创建时会首先调用父类的构造函数
2、父类构造函数执行结束后,执行子类的构造函数
3、当父类的构造函数有参数时,需要在子类的初始化列表中显示调用
4、析构函数调用的先后顺序与构造函数相反
5. 继承与组合混搭情况下,构造和析构调用原则
组合:初始列表有多个继承
原则:
构造:爷—父---子
析构:子—父---爷
6. 继承中的同名成员变量处理方法
1、当子类成员变量与父类成员变量同名时,子类依然从父类继承同名成员
2、在子类中通过作用域分辨符::进行同名成员区分(在派生类中使用基类的同名成员,显式地使用类名限定符)
3、默认:子类
4、同名成员存储在内存中的不同位置
7. 派生类中的static关键字
继承和static关键字
理论知识
Ø 基类定义的静态成员,将被所有派生类共享
Ø static函数也遵守3个访问原则
Ø 派生类中访问静态成员,用以下形式显式说明:
类名 :: 成员
或通过对象访问 对象名 . 成员
Ø static易犯错误(不但要初始化,更重要的显示的告诉编译器分配内存)
三 多继承
- 多继承概念
Ø 一个类有多个直接基类的继承关系称为多继承
Ø 多继承声明语法
class 派生类名 : 访问控制 基类名1 , 访问控制 基类名2 , … ,访问控制 基类名n
{
数据成员和成员函数声明
};
Ø 类 C 可以根据访问控制同时继承类
A 和类 B 的成员,并添加自己的成员
2. 多继承的派生类构造和访问
Ø 多个基类的派生类构造函数可以用初始式调用基类构造函数初始化数据成员
Ø 执行顺序与单继承构造函数情况类似。多个直接基类构造函数执行顺序取决于定义派生类时指定的各个继承基类的顺序。
Ø 一个派生类对象拥有多个直接或间接基类的成员。不同名成员访问不会出现二义性。如果不同的基类有同名成员,派生类对象访问时应该加以识别。
3 虚继承
如果一个派生类从多个基类派生,而这些基类又有一个共同的基类,则在对该基类中声明的名字进行访问时,可能产生二义性
总结:
Ø 如果一个派生类从多个基类派生,而这些基类又有一个共同
的基类,则在对该基类中声明的名字进行访问时,可能产生 二义性
Ø 如果在多条继承路径上有一个公共的基类,那么在继承路径的某处 汇合点,这个公共基类就会在派生类的对象中产生多个基类子对象
Ø 要使这个公共基类在派生类中只产生一个子对象,必须对这个基类
声明为虚继承,使这个基类成为虚基类。
Ø 虚继承声明使用关键字 virtual
继承总结
Ø 继承是面向对象程序设计实现软件重用的重要方法。程序员可以在已有基类的基础上定义新的派生类。
Ø 单继承的派生类只有一个基类。多继承的派生类有多个基类。
Ø 派生类对基类成员的访问由继承方式和成员性质决定。
Ø 创建派生类对象时,先调用基类构造函数初始化派生类中的基类成员。调用析构函数的次序和调用构造函数的次序相反。
Ø C++提供虚继承机制,防止类继承关系中成员访问的二义性。
Ø 多继承提供了软件重用的强大功能,也增加了程序的复杂性。