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
课程中,我可以获得parent
或grandparent
的属性
我很困惑,我试着想一想会发生什么 内部编译器和内存端。
让display()
成为所有Grandparent
和parent1
以及parent2
的成员函数。现在虚拟基类采取了必要的步骤,以避免child
中出现歧义,实际上有两个重复的parent1
和parent2
集合,是的grandparent
1}}。
现在,我想明确表示
如果display()
的{{1}}是在内部使用指针和地址从grandparent
访问的。 child
无法获得任何重复的集合。所以,我们没有考虑任何含糊不清的问题,为什么我们还要选择child
个功能呢?
在其他情况下,我上面的想法是错误的,并认为virtual
的{{1}}实际上或我认为被复制进入display()
,grandparent
同样如此。 (请不要说基地child
将有权访问或包含parent1 and parent2
的公众和受保护成员,对不起,原因是,这就是答案我发现在 Internet 上,当我想到我的发生时,它并没有澄清我的结果)因此,孩子应该在同一个child
类中具有相同的成员函数,这个绝对应该给出问题,因为在grandparent, parent1 and parent2
中,孩子的成员函数与child
成员函数不同。
任何其他情况都可以,请解释。
我尽最大努力详述我的疑问。 如果可能,请帮助我理解虚拟类和继承概念的确切运作方式。
谢谢。
-
答案 0 :(得分:1)
派生类由基类加上额外位的所有内容组成。没有复制,因为一个类就像一个设计。这是实际存在的东西的对象。当您实例化派生类(创建它的对象)时,它将包含派生类和基类的成员。
你的课程就像一幅蓝图 - 房子的设计。我可以设计一间带一间卧室,一间浴室和一间厨房的房子。这个蓝图就像你的班级。我还不能在浴室里撒尿:它只是纸上的设计。我不能在厨房做三明治。现在我可以选择建造房屋 - 这是一个对象。现在我可以小便。这是一种解脱,我不得不等待多年。事实上,我可以根据自己的喜好制作这套房子的副本。制作副本实例化更多对象。
但有一天,我想我自己想要一个更大的房子基于这个,所以我做了一个新的设计,我可以简单地添加到扩展房子的旧设计。 这是继承。我的新设计增加了一个休息室和另一个厕所(我需要小便,好吗?)。当我实例化这个版本的设计时,我会得到一个房子,其中包含第一个设计的卧室,浴室,厨房以及我的休息室。
听起来像你需要一本关于面向对象编程的好书。毫无疑问,它不会像我的解释那样令人惊讶,并且可能不会像人们通常所希望的那样谈论厕所,但它解释的远不止于此。祝你好运。
答案 1 :(得分:0)
派生类型的对象在其中包含基类型的子对象。当您调用基类的非虚拟非静态成员函数时,将在该基础子对象上有效地调用该函数。
(注意,当您使用多重继承时,可以有多个相同类型的基础子对象。)
虚函数的行为有所不同:虚拟调用总是请求(通常是动态的)搜索调用对象是基础子对象的派生最多的对象,然后调用函数的最后一个覆盖器。但这与问题的关键点基本无关。例如,当您拥有struct A { virtual void f(); }; struct B : A {};
然后调用B().f()
时,仍会在A
- 子对象上执行该调用 - 虚拟调度仅在此处启动。