一、定义基类
1、c++中,基类需要将它的两种成员函数区分开来:一种是希望派生类进行覆盖的函数,另一种是希望派生类直接继承而不要改变的函数。
对于前者,基类通常将其定义为虚函数,当我们使用指针或者引用调用虚函数时,该调用将被动态绑定,根据对象类型选择执行版本
2、基类通过在其成员函数的声明语句(不得用于类外部的函数定义)前加上virtual使得该函数执行动态绑定
3、任何构造函数出外的非静态函数都可以是虚函数
4、如果在基类中把一个函数声明称虚函数,那么该函数在派生类中隐式地也是虚函数
5、成员函数如果没有被声明为虚函数,则其解析过程发生在编译时而非运行时
6、如果类希望它的成员允许派生类访问而禁止其他用户访问,可以将其声明为protected
二、定义派生类
1、派生类必须使用类派生列表明确指出他是从哪个基类继承而来,派生类列表的形式是:冒号+(访问说明符)+逗号分隔的基类列表,其中访问说明符可以是:public、protected、private
虚函数
2、派生类可以在它覆盖的函数前使用virtual关键字,但不是必须
3、c++11标准允许派生类显式的注明它使用某个成员函数覆盖了它继承的虚函数,具体做法是:在形参列表后、或者在const成员函数的const关键字后、或者在引用成员函数的引用限定符后加一个关键字override
派生类构造函数
4、在派生类中不能直接初始化继承而来的成员,需要调用基类的构造函数来初始化基类部分
继承与静态成员
5、如果基类定义了一个静态成员,则在整个继承体系中只存在该成员的唯一定义。不论派生出多少派生类,每个静态成员都只存在唯一的实例
被用作基类的类
6、如果我们想将某个类作为基类,则该类必须已经定义而非仅仅声明。从另一个方面来说,一个类不能派生它本身
class Shape; //仅有声明不可做为基类
7、每个类都会继承直接基类的所有成员,对于一个最终生成的派生类来说,它会继承其直接基类的成员,依次推至继承链的顶端,包含所有间接基类的子对象
防止继承的发生
8、c++11中,在类名后跟一个关键字final,可以防止继承的发生
三、类型转换与继承
1、因为派生类对象中含有与其基类对应的组成部分,所以我们能把派生类的对象当成基类对象来使用;也能将基类的指针或引用绑定到派生类对象中的基类部分上
class Shape;
class Circle :public Shape;
Shape s; //基类对象
Circle c; //派生类对象
Shape *p = &s; //p指向Shape对象
s = &c; //p指向c的Shape对象部分
Shape &r = c; //r绑定到c的Shape对象部分
这种转化通常称为派生类到基类的类型转换,其转换是隐式执行的
2、当我们使用存在继承关系的类型时,必须将一个变量或其他表达式的静态类型与该表达式表示对象的动态类型区分开来。静态类型表示在编译时总是已知的;动态类型直到运行时才可知
3、如果表达式既不是引用也不是指针,则它的动态类型永远与静态类型一致,类型转化只对指针或引用类型有效
4、和任何其他成员一样,派生类向基类的类型转换也可能会由于访问权限而变得不可行