前言
11周周三考试,也就短短10天,中间夹杂着各种ddl!冲鸭冲鸭冲鸭!
本章节的重点如下:
1. 继承了可以进行什么操作?
继承的派生类,除了继承了原来类的成员,还能产生新的成员:
- 增加新的数据成员或成员函数
- 重新定义已有成员函数
- 改变现有成员访问属性
这些让我很惊讶的一点是,继承竟然可以改变现有成员的访问属性!
2. 单继承和多继承各种格式
单继承定义: class 派生类名 : 继承方式 基类名
多重继承定义:class 派生类名 : 继承方式1 基类名1,继承方式2 基类名2
单继承构造函数: 派生类名(总参数表):基类名(参数表){新增成员初始化}
多重继承构造函数:派生类名(总参数表):基类名1(参数表1),基类名2(参数表2),{新增成员初始化}
3. 多种继承方式访问权限
- 基类中私有成员不允许在派生类成员函数或被派生类对象访问。
- 基类中公有成员被私有继承后,只能被派生类成员函数访问。
4. 多重继承的二义性是个啥?
在以下两种情况会出现二义性:
- 多个基类中含有同名的成员,在派生类中访问该成员则冲突→使用限定名访问同名成员
- 多个基类有一个共同的祖先基类,在派生类中访问该祖先基类的成员时则冲突→将祖先类设置为虚基类
限定名实现:B1::a; B2::a;
B1::a;
B2::a;
虚基类实现
class A{
}
class B1:virtual public A{
}
class B2:virtual public A{
}
class C:public B1,public B2{
}
5. 派生类和基类的爱恨情仇
- 在公有继承的情况下,一个派生类对象可以作为基类对象使用。
为啥呢???你想啊,既然派生类是共有继承基类来的,那么基类的所有成员,派生类的对象都有。因此派生类的对象,可以当作基类对象使用。
6. 动态联编和虚函数、多态的关系
要分析三者的关系,首先得明确一下三者的定义:
动态联编:在运行时确定函数调用所使用的函数体
多态:同样的对象被类的不同对象接收时导致完全不同的行为
多态是动态联编的一种实现,动态多态是采用动态联编,通过虚函数实现的。
练习题总结
1.派生类继承基类时,如果省略继承方式,则默认为( c )继承。
A. 公有 B. 保护 C. 私有
这个真的不记得,但应该和类中成员定义一样,未声明均定义为私有。
2.在如下继承层次下,当实例化有派生类对象时,调用构造函数的顺序为( )。
class Base{…};
class Base1: virtual Base{…};
class Base2: virtual Base{…};
class Derived : public Base2, public Base1{…};
A. Base(), Base1(), Base(), Base2(), Drived()
B. Base(), Base2(), Base(), Base1(), Drived()
C. Base(), Base1(), Base2(), Drived()
D. Base(), Base2(), Base1(), Drived()
D,由于对于祖先类的继承方式为虚继承,因此在调用构造函数的时候只需要一次,若不是虚继承,则此题就需要选B啦~
3.如有基类Base和派生类Derived,实例化对象Base b; Derived d;叙述正确的是( )。
A. Derived* pDev = new Base();
B. Derived类中不能定义与Base类同名的成员,以免引用时引起歧义;
C. Base* pb =&d ; Derived* pd = &b 为正确的赋值操作;
D. Base& rb = d; Base bb = d; 为正确的赋值操作;
这题选D,