Effective C++学习有感--第六章 继承与面向对象设计(二)

         今天继续学习继承与面向对象的章节,在这个章节里,我们会学到一些易于常规的东西。

心得1:考虑Virtual函数以外的选择

         在条款35里,作者举了一个例子,一个游戏人软件里,会有暴力砍杀的情节,因此有必要为每个人物设计一个继承体系,人物被人伤害或者其他因素降低健康程度的情况并不罕见,因此决定写一个成员函数HealthValue(),然后返回一个int,由于不同的人物会有不同的选择,因此将healthvalue()声明为virtual再明显不过,但是接下来我们就要跳出面向对象的设计来考虑一下其他的手法,或者你不能理解,但是这样尝试一下非OO思想的东西其实对自己也是很有帮助的。

  1. 借助Non-Virtual interface的手法来实现Template Method模式。有一个比较有趣的思想流派,这个流派主张virtual函数应该几乎总是private,他们认为较好的设计是保留HealthValue为一个public成员函数,但是叫他们成为non-virtual,并试图调用一个private函数(比如doHealthValue),这个条款可以有两个优点。a.可以在class的定义式里直接写公有的healthvalue函数的定义,这样的话healthvalue函数就会隐式的转换为inline函数,当然你也可以不这样做,这取决于你是否希望healthvalue成为inline函数。b.NVI手法的另外一个优点是,在healthvalue函数的实现中,在调用dohealthvalue()调用之前,你可以做一些准备工作和调用之后的清场工作,比如事前工作包括“锁定互斥器”,验证函数的执行的先决条件等等,事后工作包括解锁互斥器等等。NVI手法并不一定需要是virtual函数声明为private,其实这一切都取决于你自己。顺便介绍一下设计模式里的Template Method方法,定义一个操作中算法的骨架,而将一些步骤延迟到子类中,Template Method使得子类可以不改变一个算法的结构即可重定义改算法的某些特定步骤。
  2. 借助Function Pointers实现strategy模式。NVI手法对public virtual函数一个有趣的替代手法,但从某周设计角度观察,他只比窗饰花样更强一些而已,而此外的另外一个有趣的设计是人物的健康指数与人物的类型无关,这样的设计完全不需要人物的成分,例如我们可以要求每个人物的构造函数允许接收一个函数的指针,指向一个健康计算函数,而我们可以调用该函数进行实际的计算,这个手法有两个优点:a.同一人物类型之不同实体可以有不同的健康计算函数,一个实体的健康计算函数可以在运行时期变更,例如可以提供一个SetFunc()接口来设置某一时刻的健康计算函数。strategy模式:定义一系列的算法,把他们一个个的封装起来,并使他们可以相互替换,这个模式使得算法的变化可以独立于使用它的客户。
  3. 为了避免陷入面向对象设计的路上因常规而形成的凹洞中,偶尔我们需要对者车轮猛推一把。这个世界还有其他的许多道路值得我们去花时间进行研究。

心得2:绝不从新定义继承而来的non-virtual函数

  1. 上一讲里知道所谓public其实意味者一种is-a的关系,non-virtual函数意味该函数在class里建立一个不变性,凌驾于其特异性。class D继承与class B,那么就意味这一个D就是B,如果我们重新定义了这个non-virtual函数,也就是从新定义了D的不变性,因此D就不是一个B了,这也就互相矛盾了。
  2. 必须将析构函数这是为virtual类型的,因为决不改变继承而来的non-virtual函数,如果我们不从新定义析构函数的话,那么我们总会调用基类的析构函数,因此我们就会造成不使用virtual析构函数的恶果!所以永远记住要使用virtual析构函数。

心得3:绝不重新定义继承而来的缺省参数值

      绝不要重新定义一个你继承而来的缺省参数值,因为缺省参数值都是静态绑定,而virtual函数--你唯一应该复写的东西确实动态绑定!

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值