一、通常在层次关系的根部有一个基类,其他类别则直接或间接的从基类继承而来,这些继承得到的类称为派生类
二、基类将类型相关的函数与派生类不做改变直接继承的函数区分对待,对于某些函数,基类希望它的派生类各自定义适合自身的版本,此时基类就将这些函数声明成虚函数
三、类派生列表的形式是: 首先是一个冒号,后面紧跟以逗号分隔的基类列表
四、派生类必须在七内部对所有重新定义的虚函数进行声明
五、新标准允许派生类显示的注明它将使用哪个成员函数改写基类的虚函数,具体措施是在该函数的形参列表之后增加一个override关键字
六、基类必须将它的2种成员函数区分开来,1种是基类希望其派生类进行覆盖的函数;1种是基类希望派生类直接继承而不要改变的函数
七、当使用指针或引用调用虚函数时,该调用将动态绑定
八、关键字virtual只能出现在类内部的声明语句之前而不能用于类外部的函数定义,如果基类把一个函数声明成虚函数,则改函数在派生类种隐式的也是虚函数
九、能把派生类对象当成基类对象来使用,也能把基类的指针或引用绑定到派生类对象中的基类部分上
十、如果基类定义了一个静态成员,则在整个继承体系中只存在该成员的唯一定义
十一、声明中包含类名但不包含它的派生列表
十二、在类后跟一个关键字final可以防止继承
十三、当使用基类引用(或指针)时,实际上并不青春该引用(或指针)所绑定对象的真实类型,该对象可能是基类的对象,也可能是派生类的对象
十四、表达式的静态类型在编译时是已知的,它是变量声明时的类型或表达式生成的类型; 动态类型则时变量或表达式表示的内存中的对象的类型
十五、因为一个基类的对象可能是派生类对象的一部分,也可能不是,所以不存在从基类像派生类的自动类型转换;即使一个基类指针或引用绑定在一个派生类对象上,也不能执行从基类向派生类转换
十六、派生类向基类的自动转换只对指针或引用类型有效
十七、当使用基类的引用或指针调用一个虚成员函数时会执行动态绑定,因为直到运行时才能知道调用了哪个版本的虚函数,所以所有虚函数都必须有定义
十八、一个派生类的函数如果覆盖了某个继承而来的虚函数,则它的形参类型必须被覆盖的基类函数完全一致,同样,派生类中虚函数的返回类型也必须与基类函数匹配/该规则存在一个例外,当类的虚函数返回类型是类本身的指针或引用时,此规则无效
十九、虚函数也可以有默认实参
二十、某些情况下,希望对虚函数调用不要进行动态绑定,而是强迫其执行虚函数的某个版本,则使用作用域运算符可以实现
二一、通过正赛函数体的位置书写=0,表示将一个虚函数说明为纯虚函数,=0只能出现在类内部的虚函数声明语句处
二二、含有纯虚函数的类是抽象基类,不能创建一个抽象基类的对象
二三、某个类对其继承而来的成员的访问权限受到2个因素影响: 一个是基类中该成员的访问说明符,另一个是在派生类的派生列表中的访问说明符
二四、派生访问说明符对于派生类的成员能否访问其直接基类的成员没有影响,对基类成员的访问权限只与基类中访问说明符有关
二五、派生类向基类的转换是否可以访问由使用该转换的代码决定,同时派生类的派生访问说明符也会有影响,假如D继承自B:
1、只有当D公有的继承B时,用户代码才能使用派生类向基类的转换,如果D继承B的方式是受保护的或者私有的,则用户代码不能使用该转换
2、不论D以什么方式继承B,D的成员函数和友元都能使用派生类向基类的转换,派生类向其直接基类的类型转换对于派生类的成员和友元来说永远是可访问的
3、如果D继承B的方式是公有的或者受保护的,则D的派生类的成员和友元可以使用D向B的类型转换,反之,如果D继承B的方式是私有的,则不能使用
二六、友元关系不能继承
二七、如果派生类的成员与基类的某个成员同名,则派生类将在其作用域内隐藏该基类成员,即使派生类成员和基类成员的形参列表不一致
二八、假如基类与派生类的虚函数接受的实参不同,就无法通过基类的引用或指针调用派生类的虚函数了
二九、 继承关系对基类拷贝控制最直接的影响是基类通常应该定义一个虚析构函数
三十、如果一个类需要析构函数,那么它也同样需要拷贝和赋值操作,但基类的析构函数并不遵循此规则
三一、大多数基类都会定义一个虚析构函数,因此在默认情况下,基类通常不含有合成的移动操作,而且在它的派生类中也没有合成的移动操作。因为基类缺少移动操作会阻止派生类拥有自己的合成移动操作,所以当确实需要执行移动操作时应该首先在基类中定义
三二、类不能继承默认、拷贝、移动构造函数
三三、一个using声明语句不能指定explicit或constexpr
三四、当一个基类构造函数含有默认实参时,这些实参并不会被继承。相反,派生类将获得多个继承的构造函数,其中每个构造函数分别省略掉一个含有默认实参的形参,例如: 如果基类有一个接受2个形参的构造函数,其中第二个形参含有默认实参,则派生类将获得2个构造函数,1个构造函数接受2个形参,另1个构造函数只接受1个形参
三五、当使用容器存放继承体系中的对象时,通常必须采取间接存储的方式,因为不允许在容器中保存不同类型的元素,所以不能把具有继承关系的多种类型的对象直接存放在容器中,通常应该存放基类的指针,这些指针所指对象的动态类型可能时基类类型,也可能时派生类类型