只需要Base类中定义为 virtual void display()虚函数就行了。这样利用多态性,虽然传递的是基类指针,但实际指向的是子类对象,多态性会自动调用实际子类对象的display函数,而不是基类的函数
这就是继承的精髓所在
在实际开发中,类库作者只使用基类类型,把调用的框架搭建好,程序就写好了
而类库的调用者,通过派生类重写函数,实现了不修改基类代码的前提下,插入了自定义代码
这才是派生类的实际意义所在——插件的开发、代码的复用、保护基类代码不需要老修改
讲个实际开发的场景(有一些简化,不涉及细节)
比如说微软开发一款播放器,它希望让播放器安装不同的解码器从而支持新的播放格式
很明显,播放器开发的时候,比如说定义了一个 DecoderBase 类作为解码的基类,它有一个 decode 解码方法
显然,微软的程序员写好这段代码,并且因为将来会无限扩充,所以说会有无数多的第三方厂商未来去扩展这个类(当然,这些扩展会放在额外的动态库中,通过配置文件加载),并且实现他们的 decode 方法。
但是微软的播放器本体是先写好的,它当然只能认识DecoderBase,只能调用基类的那个decode,而不认识具体的那些XXXDecoder。而如果派生类的decode的代码得不到执行的机会,那么这种扩展,就毫无意义了。相反,他们后写出来的代码能被调用,那么那个写好的播放器,本体不用修改,只要不断加入插件,就能支持未来的一切播放格式。
所以为什么说这是精髓,就在这里。