1、什么是继承
继承是实现代码服用的重要手段,在层次关系的顶部有一个基类,其它类则是直接或者间接从基类继承而来的,这些继承而来的类称为派生类。基类负责定义继承的层次关系中所有类公有的成员,而派生类则可以定义自己特有的成员。
2、类派生列表
类的派生列表明确的指出这个类是从哪个类继承而来的。
这里我们要提到以下类的三种继承关系:
总结
1:访问说明符对于派生类直接访问基类的成员没有什么影响,这只与基类中成员的访问限定符有关。
2:访问说明符(继承关系)影响的是从外部作用于对基类继承到派生类的成员的访问。
3:无论什么继承关系,派生类始终不能访问基类中的private成员,但可以访问基类中的public和protected成员。
3、继承与类型转换
1:子类可以给父类对象进行赋值。
2:父类对象不能对子类进行赋值。
3:父类的指针和引用可以指向子类。
4:子类的指针和引用不能指向弗雷(但可以进行强制类型转换)
之所以存在父类对象到子类对象的类型转换是因为子类中包含父类的部分,子类向父类进行赋值的过程是把子类中的父类部分切割出来再拷贝到父类的成员中。
而父类指针指向子类对象这个问题我们需要引入另外两个概念
静态类型:表达式的静态类型是指在编译阶段就是已知的类型,是变量声明时的类型或者是表达式生成时的类型。
动态类型:表达式或变量的类型表示的是内存中对象的类型,直到运行时才知道是什么类型。
这里说明当我们使用基类的指针或引用时,实际上我们并不清楚指针或者引用所绑定对象是基类的对象还是派生类的对象。
4、虚函数
1、虚函数要在类的成员函数中加上virtual关键字。
2、当我们使用基类的应用或指针调用一个虚函数时会发生动态绑定。
3、所有的虚函数都必须要定义。
4、发生动态绑定时所调用的虚函数是与绑定到指针或引用上的对象的动态类型相匹配的那一个。
注意
动态绑定只有当我们通过指针或者引用调用虚函数时才会发生。
如果派生类要对基类的虚函数进行重写,则函数名和形参和返回类型必须与基类的虚函数要一致。(协变除外)
协变:派生类中虚函数的返回类型必须与基类函数匹配,该规则有一个例外,当类的虚函数返回类型是类本身的指针或者引用时,上述规则无效。