gpt4 book ai didi

c++ - 从接口(interface)虚拟继承的成本

转载 作者:搜寻专家 更新时间:2023-10-31 02:08:17 25 4
gpt4 key购买 nike

这是了解使用虚拟基类继承的影响的尝试,尤其是在运行时成本方面。我想到的情况还涉及接口(interface)(或ABC)。

   I----------
/ | \ |
D1 D2 D3 Isub
| /
D3Dec

因此,我们有一个接口(interface)I,我们有不同的实现D1D2D3。但现在的转折点是,有一个特殊的装饰器,它只包装了一些(任意的)I 实现,然后根据 表达的契约添加了一个扩展特性我

因此,从逻辑或设计的角度来看,希望通过从 I 派生的子接口(interface) Isub 来表达扩展能力。因此,任何 Isub 也自动履行 I 契约。

问题:性能影响

现在,要在 C++ 中实现这样的功能,任何接口(interface)I 的实现都必须虚拟,同样,Isub 必须从 I 继承 virtual,否则我们最终会在 D3Dec 中得到两个 I 子对象.

  • 这是否意味着,I 的每个实现都必须在内存布局方面付出代价,并需要进行棘手的虚拟基址偏移调整。正确吗?
  • IIsub 都是纯虚函数时,情况是否不同,即没有成员,只有纯虚函数?那么是否可以在没有虚拟继承的情况下进行这项工作?
  • 需要注意的棘手一点是当客户端代码仅获取对Isub 的引用时。如果客户端调用扩展功能,他们实际上会在 D3Dec 中调用所述功能的实现,而这又会使用其他 I 功能来实现扩展功能,因为显然 D3dec 对它装饰的具体 I 实现一无所知。这是否必然意味着我们必须使用虚拟继承?或者是否有任何基于模板的技巧来解决这个问题但仍然有一个(抽象的)子接口(interface) Isub

明显的替代方案当然是切断 IIsub 之间的链接,将其变成一个简单的混合。这行得通,但是很丑,因为 Isub 本身没有多大意义,独立于 I。两者甚至在签名等方面使用相同的数据类型......

最佳答案

您可以通过将接口(interface)类作为具体类的模板参数 来完全避免菱形继承问题。那么就不需要虚类继承了。

class I { ... };

template<class Ifc>
class D3Impl : public Ifc
{ ... };

typedef D3Impl<I> D3;

class Isub : public I { ... };

class D3Dec : public D3Impl<Isub>
{ ... };

关于c++ - 从接口(interface)虚拟继承的成本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47722508/

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