C++ 什么是基础和派生含义之间的“是”关系?

C++ 什么是基础和派生含义之间的“是”关系?,c++,polymorphism,C++,Polymorphism,我遇到了这个,它说 当谈到动态多态性IS-A关系保持时,IS-A关系保持在这里意味着什么 还有什么其他类型的关系?任何可能解释它们的引用?IS-A用于描述派生对象和基础对象之间的关系。派生对象通常是基础对象的特殊版本,因此可以说派生对象是基础对象 请参见这个简单的示例,一个专门用于形状基类的圆 struct shape { virtual int area() = 0; }; struct circle : shape // circle is a shape { }; 有一个和一

我遇到了这个,它说

当谈到动态多态性IS-A关系保持时,IS-A关系保持在这里意味着什么


还有什么其他类型的关系?任何可能解释它们的引用?

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

请参见这个简单的示例,一个专门用于形状基类的圆

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

struct circle : shape // circle is a shape
{

};
有一个和一个,它们的意思正是你所期望的

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

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

或者,作为另一种选择,考虑下面的类层次:

shape:
    coordinate c

square: shape
    size s
在这里,正方形继承了形状的一切,所以它是形状。但是,正方形的大小不是层次结构的一部分,因此正方形具有-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
   }
}
你会看到这个程序中的两个对象是动物,即使其中一个实际上是狗。动物对象引用可用于引用从动物派生的任何对象,因此是关系。狗是一种动物

有关此示例参考,请参见

还有什么其他类型的关系

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

遗传是一种遗传 考虑重写、扩展/隐藏基类功能

聚合具有-A 请考虑持有指向对象的指针而不控制其生命周期

A组分 考虑持有堆栈分配的对象、RAII等

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


你的第一个想法是在这里提出一个过于宽泛的问题,而不是尝试谷歌?其他类型的关系:has-a和被实现,前者意味着组合,后者等于私有继承。这个问题太宽泛了,用谷歌搜索吧。