zoukankan      html  css  js  c++  java
  • C++多继承的观察和7点体会(都是实用派的观点) good

    这历来是一个受争议的话题,书上的样板话我就不说了。我只说说自己的一点观察和体会:

    1. 多重继承在理论上是有道理,21天学通C++里举了一个例子,就是飞马继承于飞鸟(会飞)和马(会跑),你可以定义一个函数func1,使之有时候飞有时候跑(5公里以内跑,更远就飞),看上去两全其美,但如果既要飞又要跑呢?这样的自定义函数就解决不了问题了。非得多继承才行。总结:多继承理论上是有道理的。

    2. 现实生活中,完全多继承的情况很少。比如人虽然继承自父母,但也只是继承了一部分功能,还得加上自己的某些基因突变,所有会有自己的脾气和其它特性,相反使用组合的情况非常多。总结:多继承的情况很少,也不实用。

    3. 接口分担了多继承的大部分功能,使得多继承更加显得不那么必要。当然,接口没有实现相关的功能。如果想要直接使用别人已经实现的功能,仍然无法完成这个任务。但是可以在内部使用组合对象,使用一句话实现相关函数,就可以伪装成实现接口功能。总结:接口分担了相当一部分功能,估计这也是C++始终没有加入接口的原因,因为不需要嘛,有多继承和纯虚函数就已经达到了同样的目的,虽然不够优雅。另外要提一句的是,接口看上去更优雅。如果编译器支持的话(比如Delphi),可以自动释放内存,还可相互探测和转化,十分方便和强大。

    4. 多继承虽然有道理,但是与生俱来带来了一些使用上的麻烦:菱形内存接口是很痛苦的,什么虚继承之类的烦不胜烦,我还有个疑惑是,谁能提前想到自己正在定义的类将来是要被虚继承的啊?如果没想到就不会提前加上关键字,就达不成虚继承的目的。让别人提起知道某些事情,就破坏了OO的好处。另外菱形布局对虚函数表也有影响,好像有多个虚函数表,这在侯捷翻译的《深入C++探索》一书有详细描述,我也只是看了一眼,以后再补充。总结:使用太麻烦,内部实现也相当复杂,虚继承似乎破坏了OO的纯洁性。

    5. 今天在论坛上看到一个问题:“如何监控一个对象是否被析构”,回答多种多样:比如析构的时候发一个信号;如果不是实时需要,自己探测对象指针是否为NULL。但是有一个回复引起了我的注意:让所有子类都继承你的类,在那个类在析构的时候监控一下就好了。这句话立刻让我想到了C++多重继承的强大功能,这是我之前从未想到过的,而且这个功能强大到可以被滥用。

    即:我让项目中所有的类全部继承我自己定义的某个类,也不会影响原来的类继承正常的别的类。这样就有利于项目的全局管理和控制,或者快速的给所有类加上某项强大功能。对于那些不支持多继承的语言就不行了(现实中好像只有C++支持多继承,不知道有没有别的语言也支持,欢迎补充),只能通过组合来实现,那样就要修改每一个类的内部实现,哪怕仅仅是在每个类里增加一句话也是够麻烦的,而且同样破坏了OO的纯洁性。这个功能很值得深思,而且不仅仅可以改写项目里的类,有空或许可以试试改写类库(比如MFC)里的类,使类库也被置于程序员的强大控制之下,这样一个强大的类,其作用甚至远远超过CObject和QObject。
    总结:C++多继承很强大,强大到在不影响正常功能的情况下可以控制一切,强大到可以被滥用,有空一定要试试给全部类继承自己的类,看看能不能达到某种以前没有达到过的境界。

    6. C++虽然没有接口,但却有纯虚类,这样就在一定程度上替代了接口的作用。如果使用纯虚类的指针,再加上多继承的强大功能,虽然不如纯接口那么优雅,但是也已经非常实用了。

    7. 在理论上有一个把许多人绕晕的“虚继承”问题,其实在现实生活中几乎不存在,所以不必在意。看看在现代化重新设计的QT类库就知道了,大量用到了多继承,比如QWidget就是,不但没有思维上的干扰,反而非常实用和强大。如果出现要处理虚继承的情况,只能说这个类库的设计已经差到了极点。

    ----------------------------------------------------------------------------

    我在求学的时候了解过一些开源库,比如说OggVorbis、7-zip以及github上的一些开源库,还有微软的DirectX库,COM组件等
    其中了解了一些编程模式,
    懂得了使用C++的一些特殊语法可以达到很多意想不到的效果,即使是C++98。
    比如说刚刚那个就是COM的编程思想。

    有道理,都是实用派的编程模式吧。
    像什么《设计模式》这样的经典书里是不会讲到这个的。

  • 相关阅读:
    Atitit.播放系统规划新版本 v4 q18 and 最近版本回顾
    Atitit.播放系统规划新版本 v4 q18 and 最近版本回顾
    atitit.极光消息推送服务器端开发实现推送  jpush v3. 总结o7p
    atitit.极光消息推送服务器端开发实现推送  jpush v3. 总结o7p
    Atitit.文件搜索工具 attilax 总结
    Atitit.文件搜索工具 attilax 总结
    Atitit.软件命名空间  包的命名统计 及命名表(2000个名称) 方案java package
    Atitit.软件命名空间  包的命名统计 及命名表(2000个名称) 方案java package
    Atitit..状态机与词法分析  通用分词器 分词引擎的设计与实现 attilax总结
    Atitit..状态机与词法分析  通用分词器 分词引擎的设计与实现 attilax总结
  • 原文地址:https://www.cnblogs.com/findumars/p/4031461.html
Copyright © 2011-2022 走看看