什么"是A"基数和派生平均值之间的关系?

时间:2014-09-15 04:43:10

标签: c++ polymorphism

我遇到了这个question,并说明了

当谈到“动态多态”“IS-A”关系成立时, IS-A关系持有在这里意味着什么?

还有哪些其他类型的关系?任何可能解释它们的参考文献?

4 个答案:

答案 0 :(得分:3)

is-ahas-a,它们的含义正是您所期望的。

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

回到我们在开始研究面向对象概念时首先考察的简单例子,一辆汽车is-a车辆,但has-a方向盘。

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

shape:
    coordinate c

square: shape
    size s

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

答案 1 :(得分:2)

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

聚合(HAS-A) 想拿着指向对象的指针,而不是控制它的一生。

成分(更强的HAS-A) 想拿着堆栈分配的对象,RAII等。

在维基百科上可以找到很好的介绍性阅读:

答案 2 :(得分:1)

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

请参阅此简单示例, circle 专门设置形状基类。

struct shape
{
    virtual int area() = 0;
};

struct circle : shape // circle is a shape
{

};

答案 3 :(得分:1)

  

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

  

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

大多数人在is-a旁边引用has-a关系,这意味着对象可能具有特定属性或属性,但不一定由这些特征定义。 例如,Dog 有一个名称,一个重量,四条腿等等,但这不一定是什么使它成为一只狗。