1.创建派生类对象之前,程序首先生成基类对象。除非使用默认构造函数,否则应通过成员初始化列表显式调用正确的基类构造函数。
2.派生类对象也是一个基类对象(公有继承),是为is-a关系,该关系通常是不可逆的,在不进行显示类型转换的情况下,只能进行向上强制转换,即派生类指针或引用转为基类指针或引用。对基类对象可执行的任何操作,对派生类对象也可执行。基类指针或引用可在不进行显式类型转换的情况下指向和引用派生类对象,但前两者只能调用基类方法。
3.派生类对象可初始化或赋值基类对象,前者的基类部分复制给后者。
4.同一方法随上下文而异,应当使用虚方法,并在派生类中重新定义基类的方法,这将隐藏所有的同名基类方法,因此派生类应重新定义基类的所有重载版本。派生类调用方法时,仅当派生类没有重新定义该方法或使用作用域解析符时调用基类方法。若使用关键字virtual,程序将根据指针或引用指向的对象类型来选择方法,否则将根据指针或引用类型选择方法。若派生类位于派生链中,将使用最新的虚函数版本。基类的虚方法在派生类中默认为虚方法。关键字virtual只用于类声明的方法原型中。
5.基类声明虚析构函数是惯例,如此一来,释放派生对象时将按正确顺序调用析构函数。析构顺序与创建顺序相反。构造函数和友元函数不能是虚函数。
6.在派生类中使用作用域解析符可将基类虚方法同派生类版本的虚方法区分开来。
7.静态联编(早期联编),编译过程中进行的联编;动态联编(晚期联编),运行过程中进行的联编。不适用虚方法,则不需使用动态联编,静态联编的效率更高。
8.虚函数的工作原理:每个对象添加指向虚函数表的隐藏成员,该表存储对象的虚函数地址。若提供了虚函数的新定义,那么将替换或添加新函数的地址,否则使用原始版本的地址。
9.返回类型协变:重新定义继承的方法时,若返回类型是基类引用或指针,可修改为指向派生类的引用或指针。
10.对外部世界来说,保护成员的行为与私有成员类似;对派生类来说,保护成员的行为与公有成员类似。
11.纯虚函数声明的结尾处为=0,提供未实现(允许有实现)的函数。抽象基类至少包含一个纯虚函数,且不能创建该类对象。
12.ABC理念:派生类必须覆盖抽象基类的纯虚函数,遵循其设置的接口规则。
13.基类和派生类都采用动态内存分配时,派生类的析构函数、复制构造函数、赋值运算符都须使用相应的基类方法处理基类元素。
14.基类对象赋给派生类对象的情况:强制类型转换,派生类定义了相关的构造函数或是参数为基类引用的赋值运算符函数。
原文:https://www.cnblogs.com/aPaulWong/p/14716620.html