我一直觉得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