gpt4 book ai didi

c++ - 钻石传承

转载 作者:IT老高 更新时间:2023-10-28 23:02:17 26 4
gpt4 key购买 nike

Assume classes D and E and F all inherit from base class B, and that class C inherits from D and E.

(i) How many copies of class B appear in class C?

(ii) How would using virtual inheritance change this scenario? Explain your answer.

(iii) How does Java avoid the need for multiple inheritance for many of the situations where multiple inheritance might be used in C++?

以下是我目前的一些想法,但我绝不是 C++ 专家!

(i) 如果 C 继承自 B 的子类 D 和 E,那么从技术上讲,D 和 E 会是它们的父类(super class)的拷贝吗?那么如果 C 继承自 D 和 E,则意味着 C 中有 2 个 B 拷贝。

(ii) 使用 virtual 有点类似于在 Java 中使用 Abstract(我认为)。现在考虑到这一点,这意味着 C 中不会有 B 的多个拷贝,因为实例化将级联到所需的级别。我不知道如何解释我的解释,但说 B 有一个名为 print() 的函数,它打印“我是 B”,而 C 覆盖这个函数,打印“我是 C”。如果你在没有 virtual 的情况下在 C 上调用 print(),你最终会打印“i am B”,使用 virtual 意味着它会打印“i am C”。

(iii) 我这里的想法是Java可以使用接口(interface)来避免使用多重继承。您可以实现多个接口(interface),但只能扩展一个类。我不确定这里还需要添加什么,因此任何输入或相关资源都会有所帮助。

最佳答案

(i) 和 (iii) 是对的。无论如何,根据我的经验,在 C++ 中,当我使用多重继承时,大部分时间都是因为基础是接口(interface)(C++ 中不支持关键字的概念,但无论如何你都可以执行它)。

(ii)的第一句话是对的,但是您的第二句话是在谈论虚函数,这与虚继承完全不同。虚拟继承意味着B只有一个拷贝,DE 都有相同的拷贝作为它们的基础。功能上没有区别,区别在于B的成员变量(和基类)。

如果有函数打印出B的成员变量foo;那么如果 (ii) 这个函数总是打印相同的值,因为只有一个 foo,但是如果 (i) 从 D 基类调用该函数可能会打印从 E 基类调用它的值不同。

“菱形继承(钻石问题)”这个词用两个词概括了这一切,作为一个很好的助记符:)

关于c++ - 钻石传承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23586556/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com