【问题标题】:What does "IS A" relation between base and derived mean? [closed]基础和派生之间的“IS A”关系是什么意思? [关闭]
【发布时间】:2023-04-10 15:42:02
【问题描述】:

我遇到了这个question,它说

当谈到“动态多态性”时,“IS-A”关系成立,IS-A 关系成立是什么意思?

还有哪些其他类型的关系?任何可以解释它们的参考资料?

【问题讨论】:

  • 你的第一个想法是在这里问一个过于宽泛的问题而不是尝试谷歌?
  • “其他类型的关系”:“has-a”和“is-implemented-in-terms-of”,前者表示“组合”,后者相当于“私有继承”。这个问题太笼统了,google一下吧。

标签: c++ polymorphism


【解决方案1】:

is-ahas-a,它们的意思正是你所期望的。

Has-a 表示其中包含另一个类型的类型。 Is-a 表示从另一个类型派生的类型。

回到我们开始研究面向对象概念时首先检查的简单示例,汽车is-a 车辆,但它是has-a 方向盘。

或者,作为替代方案,请考虑以下类层次结构:

shape:
    coordinate c

square: shape
    size s

在这里,正方形继承了形状的所有内容,因此它是一个形状。但是,正方形的 size 不是层次结构的一部分,因此正方形 has-a 大小。

【讨论】:

    【解决方案2】:

    继承 (IS-A) 考虑覆盖、扩展/隐藏基类功能。

    聚合 (HAS-A) 想想持有一个指向对象的指针而不是控制它的生命周期。

    作曲(强 HAS-A) 想想持有一个堆栈分配的对象,RAII 等。

    可以在 Wikipedia 上找到好的入门读物:

    【讨论】:

      【解决方案3】:

      IS-A 用于描述派生对象和基础对象之间的关系。派生对象通常是基础对象的特殊版本,因此您可以说派生对象基础对象

      看这个简单的例子,一个 circle 特化了一个 shape 基类。

      struct shape
      {
          virtual int area() = 0;
      };
      
      struct circle : shape // circle is a shape
      {
      
      };
      

      【讨论】:

        【解决方案4】:

        IS-A 关系在这里是什么意思?

        这意味着从某个基类型派生的所有对象实际上都是该基类型的对象,即使它们在您的程序中被它们的实际类型引用。

        以这个(Java)为例:

        class Animal {    
           public void move(){
              System.out.println("Animals can move");
           }
        }
        
        class Dog extends Animal {
        
           public void move() {
              System.out.println("Dogs can walk and run");
           }
        }
        

        如果你要参加以下测试:

        public class TestDog {
        
           public static void main(String args[]) {
              Animal a = new Animal(); // Animal reference and object
              Animal b = new Dog(); // Animal reference but Dog object
        
              a.move();//output: Animals can move
        
              b.move();//output:Dogs can walk and run
           }
        }
        

        你会看到这个程序中的两个对象是动物,尽管其中一个实际上是狗。 Animal 对象引用可用于引用从Animal 派生的任何对象,因此is a 关系。 DogAnimal

        有关此示例参考,请参阅 this post

        还有哪些其他类型的关系?

        大多数人在提到has-a 旁边提到is-a 关系,这意味着一个对象可能具有特定的属性或属性,但不一定由这些特征定义。 例如,Dog有一个名字、体重、四条腿等,但这并不一定是它成为狗的原因。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-11-30
          • 2022-01-21
          • 1970-01-01
          • 2018-07-17
          • 1970-01-01
          • 2010-12-29
          • 2014-09-20
          • 1970-01-01
          相关资源
          最近更新 更多