0、本章内容:
is-a关系的继承。
如何以公有方式从一个类派生出另一个类。
保护访问。
构造函数成员初始化列表。
向上和向下强制转换。
虚成员函数。
早期(静态)联编与晚期(动态)联编。
抽象基类。
纯虚函数。
何时及如何使用公有继承。
1、一个简单的基类:
1.1 派生一个类
存储了基类的数据成员。
可以使用基类方法。
需要自己的构造函数。
可以根据需要添加额外的数据成员和成员函数。
1.2 构造函数:访问权限的考虑
派生类构造函数必须使用基类构造函数。
用成员初始化列表,没有则用默认构造函数。
1.3 使用派生类
1.4 派生类和基类之间的特殊关系
派生类可以使用基类方法。
基类指针可以指向派生类对象,基类引用可以引用派生类对象。
派生类可以初始化基类,可以赋值给基类。
使用隐式复制构造函数、隐式重载赋值运算符函数。
2、继承:is-a关系:
不能删除基类属性。
3、多态公有继承:
3.1 开发Brass类和BrassPlus类
基类和派生类,都带virtual使用对象的类型,都不带virtual使用指针或引用的类型。
基类使用virtual,派生类默认带virtual,使用对象的类型。
基类不使用virtual,派生类使用virtual,使用指针或引用的类型。
为基类声明一个虚析构函数也是一个惯例。
只有构造函数才能使用成员初始化列表。
4、静态联编和动态联编:
4.1 指针和引用类型的兼容性
使用基类引用或指针作为参数的函数调用,将进行向上转换。
4.2 虚成员函数和动态联编
编译器对非虚方法使用静态联编,对虚方法使用动态联编。
如果需要在派生类中重新定义基类的方法,则将它设置为虚方法,否则设置为非虚方法。
4.3 有关虚函数的注意事项
构造函数不能是虚函数,创建派生类对象应该调用派生类的构造函数。
析构函数应当是虚函数,即使这个类不用作基类。
友元函数不能是虚函数,因为只有成员函数才能使虚函数。
重新定义继承的方法不是重载,而是隐藏。
如果返回的是基类引用或指针,则可以修改为指向派生类的引用或指针(返回类型协变)。
5、访问控制:protected:
派生类可以访问基类的protected成员。
6、抽象基类:
纯虚函数 = 抽象函数 + 虚函数。
包含纯虚函数的类只能用作基类。
6.1 应用ABC概念
6.2 ABC理念
7、继承和动态内存分配:
7.1 第一种情况:派生类不使用new
不需要定义显式析构函数、复制构造函数和赋值运算符。
7.2 第二种情况:派生类使用new
需要定义显式析构函数、复制构造函数和赋值运算符。
对于基类元素,显式析构函数自动完成,复制构造函数用成员初始化列表,赋值运算符显式调用基类赋值运算符。
7.3 使用动态内存分配和友元的继承分配示例
派生类使用<<需要强制类型转换来使用基类的<<。
8、类设计回顾:
8.1 编译器生成的成员函数
默认构造函数、复制构造函数、赋值运算符。
8.2 其他的类方法
构造函数、析构函数、转换、按值传递对象与传递引用、返回对象和返回引用使用const。
8.3 共有继承的考虑因素
什么不能被继承?构造函数、析构函数、赋值运算符、友元函数、静态函数。
8.4 类函数小结
9、总结:
null。