1、继承的本质:代码的复用
2、继承方式:public、protected、private
默认为private
3、类与类的关系
(1)组合:a part of/has a
(2)继承:a kind of/is a
(3)代理:容器适配器
4、派生类继承了基类的什么?
答:派生类继承了除基类的构造函数、析构函数之外的所有成员和成员函数,还继承了基类的作用域。
5、派生类对象的构造方式
答:先构造从基类继承来的成员(在派生类的初始化列表中)
再构造派生类自己的成员
6、继承方式的比较
7、基类与派生类同名的成员方法的关系
(1)重载:同一个作用域、同一类中、同名、形参列表相同
(2)隐藏:不同作用域、有继承关系、同名
隐藏了基类中所有同名的方法
(3)覆盖:不同作用域、继承关系、有虚函数(在基类中)、同名
覆盖了基类中同名参数列表相同的虚函数
8、基类对象和派生类对象
基类对象不能赋值给派生类对象 但是派生类对象可以赋值给基类对象
编译器支持从下到上转换
9、基类指针/引用和派生类对象
基类指针/引用可以指向派生类对象 但是派生类指针/引用不能指向基类对象
指针、引用支持从上到下
10、虚函数
对象的前四个字节是一个虚函数指针,虚函数指针指向一个虚函数表(RTTI信息、虚函数指针相对于整个作用于的偏移量、虚函数的地址)。
虚函数表编译时产生、运行时加载到只读数据段
11、虚函数存在的前提
(1)可以取地址
(2)有对象(依赖于对象调用)
12、哪些函数可以作为虚函数?
(1)构造函数 不可以
答:因为构造函数是用来产生对象的
(2)析构函数 可以
(3)inline内联函数 不可以
答:内联函数是在调用点直接展开的 不能取地址
(4)static修饰的函数 不可以
答:因为静态的成员函数不依赖于对象
13、静多态和动多态
静多态:编译时绑定 (模板、函数重载)
动多态:运行时绑定 (虚函数)
14、纯虚函数和抽象类
纯虚函数的定义:
virtual void bark() = 0;
有纯虚函数的类就是抽象类
抽象类不能定义对象 但是可以定义指针或引用
15、基类指针指向堆上的派生类对象时,需要将基类的析构函数写成虚析构函数,否则派生类对象不分得不到析构
16、类中成员能不能访问、访问权限是否正确、函数默认值用哪个都是在编译阶段就确定的
最终调用哪个派生类对象的方法是在运行时(虚函数表中)