C++里面的Super Call

本文讨论了C++不提供Super关键字的原因,指出在多重继承中明确指定父类方法的必要性。虽然Super调用在Java中方便,但在C++中可能导致设计上的问题,甚至成为一种anti-pattern。当父类接口需要强制子类调用其实现时,维护困难和继承混乱可能产生。解决方法是使用模板方法,让父类提供基础逻辑并提供重载接口。同时,区分接口继承和实现继承,强调实现继承在某些情况下可能导致非OOP的行为。
摘要由CSDN通过智能技术生成

       我一直觉得C++里面的一些设计是反人类的,不过没有提供Super关键词是正确的。不可否认使用Super十分方便(Java里面就提供Super)。Java之所以能提供Super关键词,是因为所有的Java对象都有一个共同的基类。但是在C++中,语言级别上没有强制要求使用一个共同的基类,这使得我们必须要指明是采用哪个父类之中的方法。这在单一继承中是麻烦的操作,但是在多重继承中是必不可少的。不过我这里要说的是,Super Call本身就是一个anti-pattern。

        详细的介绍可以参考Call super的wiki文档。这里需要明晰的是,并不是使用了父类的实现就是一个anti-pattern。所有的C++类的构造函数都需要先调用子类的构造函数,这并不是说所有的C++类都是anti-pattern。因为C++语言本身保证了这一实现是强制执行的,我们有一个统一清晰的认识。但是,如果你在设计OOP程序的时候,一个父类实现的接口,需要子类必须调用父类的实现,这就是anti-pattern。因为在C++中,并没有一种明确的措施来保障子类何时调用你的Super Call。而且一旦你采用了这种设计,会将你所有的继承关系打乱,父类的实现重构时要兼顾所有的子类,子类的子类又该该调用谁的实现呢?一旦继承关系多了,代码就会变得难以维护。这种code smell是显而易见的。

       一种解决这个困境的方法是使用模板方法,如果父类有需要子类实现的逻辑,可以将这部分逻辑写在父类里,并额外提供一个接口供子类重载。这种做法理论上是无懈可击的。具体的代码就是:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值