继承在哪里发生?

时间:2016-09-10 11:57:04

标签: c++

  • 请看下面的简单图片。

Here Child inherit's its properties from both, Parent 1 and Parent 2, and Also the properties directly from the Grand Parent.

让每个人分开。 *很明显,要避免conflict of child inheriting the properties of parent 1 and parent 2, we make a base class "virtual" .

从我学到的地方开始,我被告知在main函数中,在child课程中,我可以获得parentgrandparent的属性

我很困惑,我试着想一想会发生什么 内部编译器内存端

display()成为所有Grandparentparent1以及parent2的成员函数。现在虚拟基类采取了必要的步骤,以避免child中出现歧义,实际上有两个重复的parent1parent2集合,是的grandparent 1}}。

现在,我想明确表示

  • 如果display()的{​​{1}}是在内部使用指针地址grandparent访问的。 child无法获得任何重复的集合。所以,我们没有考虑任何含糊不清的问题,为什么我们还要选择child个功能呢?

  • 在其他情况下,我上面的想法是错误的,并认为virtual的{​​{1}}实际上或我认为被复制进入display()grandparent同样如此。 (请不要说基地child将有权访问或包含parent1 and parent2的公众和受保护成员,对不起,原因是,这就是答案我发现在 Internet 上,当我想到我的发生时,它并没有澄清我的结果)因此,孩子应该在同一个child类中具有相同的成员函数,这个绝对应该给出问题,因为在grandparent, parent1 and parent2中,孩子的成员函数与child成员函数不同。

  • 任何其他情况都可以,请解释。

我尽最大努力详述我的疑问。 如果可能,请帮助我理解虚拟类和继承概念的确切运作方式。

谢谢。

-

2 个答案:

答案 0 :(得分:1)

派生类由基类加上额外位的所有内容组成。没有复制,因为一个类就像一个设计。这是实际存在的东西的对象。当您实例化派生类(创建它的对象)时,它将包含派生类和基类的成员。

你的课程就像一幅蓝图 - 房子的设计。我可以设计一间带一间卧室,一间浴室和一间厨房的房子。这个蓝图就像你的班级。我还不能在浴室里撒尿:它只是纸上的设计。我不能在厨房做三明治。现在我可以选择建造房屋 - 这是一个对象。现在我可以小便。这是一种解脱,我不得不等待多年。事实上,我可以根据自己的喜好制作这套房子的副本。制作副本实例化更多对象

但有一天,我想我自己想要一个更大的房子基于这个,所以我做了一个新的设计,我可以简单地添加到扩展房子的旧设计。 这是继承。我的新设计增加了一个休息室和另一个厕所(我需要小便,好吗?)。当我实例化这个版本的设计时,我会得到一个房子,其中包含第一个设计的卧室,浴室,厨房以及我的休息室。

听起来像你需要一本关于面向对象编程的好书。毫无疑问,它不会像我的解释那样令人惊讶,并且可能不会像人们通常所希望的那样谈论厕所,但它解释的远不止于此。祝你好运。

答案 1 :(得分:0)

派生类型的对象在其中包含基类型的子对象。当您调用基类的非虚拟非静态成员函数时,将在该基础子对象上有效地调用该函数。

(注意,当您使用多重继承时,可以有多个相同类型的基础子对象。)

虚函数的行为有所不同:虚拟调用总是请求(通常是动态的)搜索调用对象是基础子对象的派生最多的对象,然后调用函数的最后一个覆盖器。但这与问题的关键点基本无关。例如,当您拥有struct A { virtual void f(); }; struct B : A {};然后调用B().f()时,仍会在A - 子对象上执行该调用 - 虚拟调度仅在此处启动。