C++ 正当继承

C++ 正当继承,c++,inheritance,terminology,C++,Inheritance,Terminology,什么是正确的继承?给出了一个很好的总结: 当派生类“是”基类的专用类型时,就会发生正确的继承。猫是一种动物 当一个类仅仅为了代码重用而从中继承,而没有任何其他关系时,就会发生不正确的继承。示例Cat继承自发动机。Cat不是发动机,但同时也是发动机和Cat呼噜声 当继承遵守时,是一种关系,而不是纯粹为了代码重用而继承,而不存在超类对子类的逻辑包含。我想补充一下Justin和Baxter所说的 “正确继承”一词的定义并不十分明确。正确使用继承是一个相当主观的问题 考虑以下示例: 界面:Bi

什么是正确的继承?

给出了一个很好的总结:

  • 当派生类“是”基类的专用类型时,就会发生正确的继承。猫是一种动物

  • 当一个类仅仅为了代码重用而从中继承,而没有任何其他关系时,就会发生不正确的继承。示例Cat继承自发动机。Cat不是发动机,但同时也是发动机和Cat呼噜声


当继承遵守时,是一种关系,而不是纯粹为了代码重用而继承,而不存在超类对子类的逻辑包含。

我想补充一下Justin和Baxter所说的

“正确继承”一词的定义并不十分明确。正确使用继承是一个相当主观的问题

考虑以下示例:

  • 界面:
    Bird
  • 一个具体的类:
    Ostrich
鸵鸟应该继承鸟吗?从动物学的角度来看,这是有道理的,但从计算机科学的角度来看。。。没有那么多。如果
Bird
有一个
fly
方法,那么我应该如何在
Ostrich::fly
:x中处理这个问题

CS社区有点像一场战争。事实上,你经常会看到
Circle
继承自
eliple
(或者反过来)的书籍,但从CS的角度来看,这并没有什么意义

所以我自己的小定义是:

考虑到接口为其每个方法定义了精确的语义,只有当每个方法的实现与指定的语义匹配时,一个具体类才应从接口继承


也许首先我们应该回顾一下继承本身的价值。继承是代码重用和接口重用(多态性)的一种机制。但是,通过使用组合和委托,您可以在没有继承的情况下重用代码。在许多语言中,您可以在没有继承的情况下使用多态性,但不是所有语言。在强类型语言(如C++)中,多态性本身是另一个重要的代码重用机制,只能通过继承来实现。事实上,C++分别区分了公共和私有继承的接口和代码重用。稍后将对此进行详细介绍

一般认为类的方法是与类的客户机创建契约:它保证只要调用满足某些先决条件的方法,该方法就会产生某些结果。“适当”继承是这样的:子类实例可以替换其父类,而不会违反父类的约定。也就是说,子类的任何方法都不应覆盖其基类的方法,这些方法要求更严格的前提条件,也不应提供更多“更少”的结果。返回到C++,因为在需要前一个公共和私有继承之间有明显的区别,因此可以用一个子类实例代替基类实例,所以通常认为“正确”的替换是语义正确的。否则为什么不使用私有继承呢

Ostrich
Bird
的有效子类吗?这取决于你对鸟的抽象是什么?如果
Bird
类有一个方法
Bird::fly
可以做一些有形的事情,但是
Ostrich::fly
会覆盖这个方法来抛出一个异常,从而提供比基类“更少”的结果,我会说不。但是如果类
Bird
没有
fly
方法(还有另一个子类
Flying_Bird
),没问题


我的答案是,对于C++来说,对于任何面向对象语言来说,什么都不是坏的指南。在Python这样的语言中,多态性不需要继承层次结构,人们可能更倾向于使用继承来进行代码重用。如果这种重用是有充分记载的,那么它可能不是问题。对于类层次结构,我的期望是子类可能会以多态方式使用,因此子类的实例可以替换基类的实例,从而遵守子类也是子类型的规则。

我已经检查过了,但这个例子看起来很奇怪。一个很好的总结?我支持ckv的观点…说真的,如果这个继承礼节的概念是有效的,那么一定有更好的来源来定义、总结和提供对它的见解…我的意思是我引用的文本是一个很好的总结:)-我同意你的观点,一定有更好的来源。这里的问题似乎是没有官方术语“适当的继承”,只是如果您正确地使用继承,您将表达一种is-A关系。