C++ 菱形问题2024年8月28日 | 阅读 7 分钟 在使用多重继承时,菱形问题可能会出现在计算机语言中,尤其是在 C++ 中。当代码非常长时,C++ 中的多重继承通常被用作一种技术手段。因此,为了组织程序和源代码,我们使用类。然而,如果处理不当,多重继承可能会带来问题。菱形问题主要存在于这些难题中。本教程将重点介绍菱形问题的主要原因、它如何由多重继承引起,以及解决它所需的所有方法。 代码的系统要求您需要在虚拟机上安装并运行 Ubuntu 系统,以便在 Linux 操作系统下运行与“C++ 菱形继承”相关的应用程序。这需要两个工具。一个是任意的编辑工具;因此,我们将使用 Linux 内置的“文本编辑器”。您也可以使用其他喜欢的编辑工具。第二个工具是 Ubuntu 终端,您将用它来运行程序并查看输出。由于“菱形问题”是在源代码中存在继承时出现的,我们将在本文中首先讨论多重继承。 多重继承例如,在现实世界的场景中,如果母亲和父亲孕育了一个孩子,这个孩子将继承父母的一切。因此,这个孩子的母亲和父亲被认为是派生类。回到多重继承的话题。在整个讨论过程中,我们将使用“构造函数”。当存在多重继承时,继承类(子类)的构造函数会按照祖先的顺序运行。然而,对于析构函数,继承顺序是相反的。我们现在将用一个简单的例子来说明继承在 C++ 中是如何工作的。 C++ 的多重继承特性允许一个类可以从多个类继承。被继承类的构造函数按照它们被继承的顺序被调用。例如,在下面的程序中,类 B 的构造函数在 A 之前被调用。 一个类可以从多个基类派生。 示例
让我们看一个例子来更好地理解这个概念 输出 two's constructor is called here one's constructor is called here three's constructor is called here ?????????????????.. Process executed in 0.11 seconds Press any key continue. 析构函数在构造函数之后以相反的顺序被调用。 菱形问题:当一个类的两个父类共享同一个基类时,就会出现菱形问题。例如,在下图中,TA 类从 Person 类接收了每个属性的两份副本,这会导致歧义。例如,思考下面的程序。 输出 Base :: Base ( int ) called Derived :: Derived ( int ) called Base :: Base ( int ) called Derived_2 :: Derived_2 ( int ) called Result :: Result ( int ) called ?????????????????.. Process executed in 0.11 seconds Press any key continue. 说明 在上面提到的代码中,类 "Base" 被调用了两次。当对象 "rs1" 被销毁时,"Base" 的析构函数也将被调用两次。由于对象 "rs1" 包含了 "Base" 的每个元素的两个副本,导致了混淆。这个问题可以通过使用 "virtual" 关键字来解决。为了避免在 "Result" 类中出现 "Base" 的两个实例,我们将 "Derived" 和 "Derived_2" 类创建为虚基类。例如,思考下面的程序。 输出 Base :: Base ( ) is called Derived :: Derived ( int ) is called Derived_1 :: Derived_1 ( int ) is called Result :: Result ( int ) is called ?????????????????.. Process executed in 0.11 seconds Press any key continue. 说明 在上面的程序中,对 "Person" 的构造函数只进行了一次调用。值得注意的是,在上面提到的输出中,调用的是 "Person" 的默认构造函数。即使父类显式调用了参数化构造函数,当使用 "virtual" 关键字时,默认情况下也会调用祖父类的默认构造函数。我如何使用 'Person' 类的参数化构造函数呢?必须在 "TA" 类中调用该构造函数。以下面的软件为例。 输出 Base :: Base ( int ) is called Derived :: Derived ( int ) is called Derived_1 :: Derived_1 ( int ) is called Result :: Result ( int ) is called ?????????????????.. Process executed in 0.11 seconds Press any key continue. 说明 祖父类的构造函数通常必须通过父类而不是直接调用。只有在使用 "virtual" 关键字时才允许直接调用。 下一个主题C++ 中的函数原型 |
简介:C++ 是一种强大的编程语言,为开发人员提供了许多创建高效健壮应用程序的功能。C++ 的重要功能之一是其标准模板库 (STL),它提供了许多数据结构和算法,使编程更轻松、更高效。顺序容器...
阅读 4 分钟
在本文中,我们将讨论 C++ 中的 fma() 函数,包括其语法、参数和示例。简介:C 函数 fma() 设计用于执行合并乘法运算,该运算将 (x * y) + z 作为单个合并操作进行计算,从而减少可能发生的舍入误差……
阅读 4 分钟
在计算机科学中,排序算法经常用于以特定顺序排列数据。有许多种排序算法,每种算法都有其自身的优点和缺点。希尔排序是最常用的排序算法之一,有时也称为...
阅读 4 分钟
引言:在软件开发中,设计模式为常见编程问题提供了可重用的解决方案。工厂设计模式是面向对象编程中最常用的设计模式之一。工厂设计模式提供了创建对象的接口,尽管子类……
阅读 4 分钟
CComPtr 和 CComQIPtr 是 Microsoft COM 库(Windows API 的一部分)提供的智能指针,用于管理 COM 对象的生命周期。它们用于简化创建、使用和释放 COM 对象的过程,并帮助避免诸如...
阅读 16 分钟
关联容器是无序的多重映射。它存储键值对,类似于无序映射。另一方面,多重映射允许重复值,而无序映射不允许。这些是无序容器,因此在过程中没有顺序...
阅读 4 分钟
C++ 中的阶乘程序:n 的阶乘是所有正的递减整数的乘积。n 的阶乘用 n! 表示。例如:4! = 4*3*2*1 = 24 6! = 6*5*4*3*2*1 = 720 在这里,4! 读作“4 阶乘”,也称为“4...
阅读 2 分钟
C++ 编程中的一个关键思想是指针的概念,它使程序员能够有效地处理数据结构和修改内存地址。在众多指针类型中,对象指针尤其重要,因为它们使处理存储的对象更加容易...
11 分钟阅读
模式识别是计算机科学领域中的一个重要问题。当我们要在记事本/文字处理器、浏览器或数据库中搜索字符串时,模式搜索方法会显示搜索结果。以下是一个问题陈述的示例:给定一个字符串 text[0..n-1] 和一个...
阅读 4 分钟
在本文中,我们将通过几个示例讨论如何在 C++ 中计算右侧较小的元素。下面是 N 维无序数组 arr[],由唯一整数组成。我们的目标是创建一个第二数组 count,其中 count 将……
阅读9分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India