【Effective C++ 条款34-40 笔记】【区分接口继承和实现继承】【绝不重新定义继承而来的non-virtual函数和继承而来的缺省参数值】【明智使用private继承和多重继承】】

【Effective C++ 条款34-40 笔记】【区分接口继承和实现继承】【绝不重新定义继承而来的non-virtual函数和继承而来的缺省参数值】【明智使用private继承和多重继承】】,第1张

【Effective C++ 条款34-40 笔记】【区分接口继承和实现继承】【绝不重新定义继承而来的non-virtual函数和继承而来的缺省参数值】【明智使用private继承和多重继承】】 条款34:区分接口继承和实现继承

public继承可分为两种:

  1. 函数接口继承
  2. 函数实现继承

首先要明白纯虚函数:带有纯虚函数的类是抽象类,抽象类不能实例化对象,抽象类的子类必须重写该纯虚函数才能实例化对象,否则子类也将是个抽象类

  • 成员函数的接口总会被子类继承。
  • 声明一个纯虚函数是为了让子类只继承函数接口
  • 声明一个普通的虚函数,是为了让子类继承该函数的接口和缺省实现
  • 声明一个non-virtual函数,是为了让子类继承这一函数接口以及父类对该函数的实现
条款36:绝不重新定义继承而来的non-virtual函数

举个例子,父类中有一个non-virtual函数baseFunc(),那么子类中尽量不要再定义一个baseFunc(),这是因为子类中定义的同名函数会屏蔽掉父类中的同名函数

如果真的想在子类和父类中维持一个同名函数,将父类中的该函数声明为virtual即可

条款37:绝不重新定义继承而来的缺省参数值

假设只能继承两种函数:virtual函数和non-virtual函数

那么重新定义一个non-virtual函数是不理智的,因为会屏蔽父类中的同名函数;所以,本条款适用于重新定义一个virtual函数

因为virtual函数是动态绑定的,而缺省参数值是静态绑定的

回顾几个概念:

静态类型:声明变量时的类型

动态类型:目前所指对象的类型;动态类型在程序执行过程中是可以改变的;调用一个virtual函数,究竟调用哪个函数代码取决于动态类型

条款39:明智使用private继承

如果父类和子类之间的关系是private继承,编译器不会自动将一个子类对象转换为一个父类对象(这是public继承的特点)

  • 通过private继承而来的父类的所有成员,在子类中都会变成private属性
条款40:明智使用多重继承

多重继承:一个类同时继承多个类

多重继承在出现菱形继承的时候会出现二义性,即便其中有一支是private,无法通过 “子类对象.父类方法” 的形式实现

解决菱形继承的办法是:使用virtual继承

但是virtual继承同样是有代价的:使用virtual继承的那些类产生的对象往往比non-virtual继承的类所产生的对象体积大,并且访问虚基类的成员变量速度也慢于访问非虚基类的成员变量

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5593884.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-15
下一篇 2022-12-15

发表评论

登录后才能评论

评论列表(0条)

保存