美文网首页
条款34:区分接口继承和实现继承

条款34:区分接口继承和实现继承

作者: 沧海梦帆 | 来源:发表于2016-12-02 21:45 被阅读0次

区分接口继承和实现继承

c++的(公有)继承主要有两个意图:实现继承接口继承。实现继承其实体现了面向对象封装的特性,在不修改原有代码的基础上进行扩展,然而这种继承,目前普遍认为往往带来类结构复杂不便维护的后果,也往往会有更好的办法来代替它,而接口继承为了实现多态特性。

实现继承

通过一般函数的继承实现。
特性:这种继承使一种子类不会有不同行为的继承。子类不能重新定义基类的实现,而只能使用基类的实现。

纯粹的接口继承(pure virtual)

通过纯虚函数实现。基类不提供实现(当然,从语法上提供实现也是可以的,但是经常不会这么做)。
纯虚函数最重要的特性:子类必须重新实现自己的版本。所以,这个特性就决定了派生类必定会覆盖基类中的实现,所以基类中的实现经常是不写的。

接口继承并且有缺省的实现(impure virtual)

通过非纯虚函数实现。这种继承意图是结合了实现继承和结构继承,既可以实现自己版本的接口,也可以使用基类的版本。
重要特性:派生类不强制重新实现自己的版本,但基类必须有实现。这种特性就给用户一种选择,你可以有自己的实现,也可以用基类的实现。这个特性最大的问题在于继承者没有明确表达我要使用默认缺省实现的时候使用了默认缺省的实现,这一点书中航班的例子讲的很清楚,这可能会造成严重的后果,你看实现继承虽然在代码重用上有一定作用,但往往有很危险的隐患。书中推荐的有默认实现的接口继承的方法是,利用纯虚函数的特性,在基类的纯虚函数中给出实现,而让派生类的接口主动调用这个默认实现。

那么……

基类中函数应该被声明为pure virtual ,impure virtual,还是non-virtual???
如果所有函数均是non-virtual则失去了继承的意义,因为实现继承往往是有害的,应该考虑不使用继承是不是也能方便的实现同样的功能。牢记继承最大的作用在于多态的实现
如果所有函数都是虚函数则是不是缺乏坚定立场的前兆(书中原话)。当然,不是说这种继承不对,如果全部函数都是虚函数,这就相当于Java中的接口类的概念。

相关文章

  • 条款34:区分接口继承和实现继承

    区分接口继承和实现继承 c++的(公有)继承主要有两个意图:实现继承和接口继承。实现继承其实体现了面向对象封装的特...

  • 条款 34:区分接口继承和实现继承(二)

    《Effective C++ 中文版 第三版》读书笔记 这几乎和前一个设计一模一样,只不过 pure virtua...

  • 条款 34:区分接口继承和实现继承(一)

    《Effective C++ 中文版 第三版》读书笔记 身为 class 设计者,有时候你希望 derived c...

  • js对象——继承(2)

    继承分为接口继承和实现继承,但由于接口继承只继承方法签名,而函数没有签名,所以ECMAScript只支持实现继承(...

  • 7、面向对象的程序设计3(《JS高级》笔记)

    三、继承 许多OO语言都支持两种继承方式:接口继承和实现继承。接口继承只继承方法签名,而实现继承则继承实际方法。由...

  • js中的继承-原型与原型链

    面向对象的语言支持两种继承方式,接口继承和实现继承js无法实现接口继承,只支持实现继承,主要通过原型链来实现。具体...

  • 面向对象——继承

    许多OO语言都支持两种继承方式:接口继承和实现继承。接口继承只继承方法签名,而实现继承则继承实际的方法。ECMAS...

  • 高程三 关于原型链 阅读笔记

    许多OO语言都支持两种继承方式:接口继承和实现继承。接口继承只继承方法签名,而实现继承则继承实际的方法。由于函数没...

  • JavaScript实现继承的方法

    大多OO语言都支持两种继承方式: 接口继承和实现继承 ,而ECMAScript中无法实现接口继承,ECMAScri...

  • JS继承

    大多OO语言都支持两种继承方式: 接口继承和实现继承 ,而ECMAScript中无法实现接口继承,ECMAScri...

网友评论

      本文标题:条款34:区分接口继承和实现继承

      本文链接:https://www.haomeiwen.com/subject/ymuqmttx.html