public继承可分为两种:
- 函数接口继承
- 函数实现继承
首先要明白纯虚函数:带有纯虚函数的类是抽象类,抽象类不能实例化对象,抽象类的子类必须重写该纯虚函数才能实例化对象,否则子类也将是个抽象类
- 成员函数的接口总会被子类继承。
- 声明一个纯虚函数是为了让子类只继承函数接口
- 声明一个普通的虚函数,是为了让子类继承该函数的接口和缺省实现
- 声明一个non-virtual函数,是为了让子类继承这一函数接口以及父类对该函数的实现
举个例子,父类中有一个non-virtual函数baseFunc(),那么子类中尽量不要再定义一个baseFunc(),这是因为子类中定义的同名函数会屏蔽掉父类中的同名函数
如果真的想在子类和父类中维持一个同名函数,将父类中的该函数声明为virtual即可
条款37:绝不重新定义继承而来的缺省参数值假设只能继承两种函数:virtual函数和non-virtual函数
那么重新定义一个non-virtual函数是不理智的,因为会屏蔽父类中的同名函数;所以,本条款适用于重新定义一个virtual函数
因为virtual函数是动态绑定的,而缺省参数值是静态绑定的
回顾几个概念:
静态类型:声明变量时的类型
动态类型:目前所指对象的类型;动态类型在程序执行过程中是可以改变的;调用一个virtual函数,究竟调用哪个函数代码取决于动态类型
条款39:明智使用private继承如果父类和子类之间的关系是private继承,编译器不会自动将一个子类对象转换为一个父类对象(这是public继承的特点)
- 通过private继承而来的父类的所有成员,在子类中都会变成private属性
多重继承:一个类同时继承多个类
多重继承在出现菱形继承的时候会出现二义性,即便其中有一支是private,无法通过 “子类对象.父类方法” 的形式实现
解决菱形继承的办法是:使用virtual继承
但是virtual继承同样是有代价的:使用virtual继承的那些类产生的对象往往比non-virtual继承的类所产生的对象体积大,并且访问虚基类的成员变量速度也慢于访问非虚基类的成员变量
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)