首页 > 解决方案 > 一个类的实例(不是类本身)可以是另一个类的许多实例的父类吗?

问题描述

根本问题

我正在尝试使用 C++ 中的 Vulkan 构建渲染引擎。我正在尝试从引擎结构中删除资产网格、纹理和类似的东西,我将其用于测试目的,并将其转移到它自己的单独类中。我需要访问存储在渲染引擎类中的一些对象,因为每个资产都需要能够将自己添加到顶点向量中,并且例如可以访问相同VkDevice的对象。

第一次尝试

我尝试的第一个方法是让资产的构造函数将渲染引擎作为其参数之一,然后从资产的渲染引擎获取我需要的所有对象的指针。我仍然认为这种方法可能有效,但我无法在资产类之前声明渲染引擎的类,因为渲染引擎需要它在这种情况下管理的所有资产的向量。我也不能在渲染引擎的类之前声明资产的类,因为这样我就不能将渲染引擎作为资产构造函数的参数。这感觉它应该有一个简单的解决方案,但我找不到一个,所以我去尝试我的第二种方法。

第二次尝试

我尝试的第二种方法是继承。但是,当我尝试使用它时,我意识到我不知道如何让渲染引擎类的一个实例成为资产类的许多实例的父级。每个资产都需要自己的渲染引擎,但我需要每个资产从同一个渲染引擎继承,以便渲染引擎的对象对于所有资产都是相同的,并且避免需要管理渲染引擎的许多实例。

最后的想法

我认为第一个选项可能有一种简单的方法,但我认为从长远来看,第二个选项会更有价值,因为它更易于管理、更清洁、导致更好的组织代码,甚至可以教我更多关于我开始探索的这种伟大语言的信息。我更喜欢涉及第二种方法的解决方案,但我也不知道这是否可能,因为继承似乎不适用于每个实例。最后,我对不涉及这些选项的新想法非常开放。

最后一个问题

是否有一种继承方法允许一个对象的许多实例从 C++ 中另一个对象的一个​​实例继承?

标签: c++inheritancevulkan

解决方案


是否有一种继承方法允许一个对象的许多实例从 C++ 中另一个对象的一个​​实例继承?

不,你在这里混合苹果和橙子。

继承是一种从一个或多个基类构建一个类的方法。它与这些类的实例无关,在 C++ 中,类不是对象。因此,通过从您定义D的另一个类派生一个类,但您不创建or的任何实例。BDBD

当您创建 的对象(实例)时D,这些对象都将具有相同的二进制布局,其中包括来自B和的数据成员D。也就是说,每个 class 对象都D将包含 class 的一个基本子对象BD如果没有类的基本子对象B或具有不同的二进制布局(例如通过引用B不同的地址) ,则无法创建类对象。

您可以使用引用或(智能)指针在不同对象之间共享数据,例如std::shared_ptr. 但这与类继承无关。您将不得不使用引用和(智能)指针作为类的数据成员。


推荐阅读