gpt4 book ai didi

c++ - C++ 中的非对称虚拟继承菱形

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:37:16 25 4
gpt4 key购买 nike

所以我就有了这个想法,我觉得用C++实现基本上是不可能的……但是我想问一下。我通读了 Stroustrup 的第 15 章,但没有得到答案,而且我认为关于继承钻石的其他数十亿个问题都没有回答这个问题,所以我在这里问。

问题是,当您从两个共享一个公共(public)基类的基类继承时会发生什么,但实际上只有两个基类中的一个继承自它。例如:

class CommonBase { ... };

class BaseA : CommonBase { ... };

class BaseB : virtual CommonBase { ... };

class Derived : BaseA, BaseB { ... };

我认为我想要这样做的原因是因为我正在尝试扩展现有的库而不必重新编译整个库(不想打开那一堆蠕虫)。已经存在我想修改的继承链。基本上是这样的(请原谅 ascii 艺术)

    LibBase
| \
| \
| MyBase
| |
| |
LibDerived |
| \ |
| \ |
| MyDerived
| |
LibDerived2 |
| \ |
| \ |
| MyDerived2
| |
LibDerived3 |
| \ |
| \ |
| MyDerived3
| |
LibConcrete |
\ |
MyConcrete

得到照片了吗?我希望每个“My”类的对象成为它们实际上正在替换的类的对象,但我希望继承图中的下一个类使用来自“My”基类的重写方法实现,但来自库类的所有其他方法。库类实际上没有继承所以它是这样的

class LibDerived : LibBase

但是如果我让我的类虚拟继承

class MyBase : virtual LibBase {};
class MyDerived: virtual MyBase, virtual LibDerived {};

由于 MyDerived 将有一个 vtable,而 MyBase 将有一个 vtable,是否只有一个 LibBase 对象?

我希望这个问题足够清楚。

最佳答案

为了简化答案,让我们将虚拟/非虚拟视为重复或非重复内容。

class LibDerived : LibBase

声明:我允许 LibBase 两次(或更多次)进入 LibDerived 的降序

class MyBase : virtual LibBase {};

声明:我允许编译器将 MyBase 降序中的两个 LibBase 条目优化为单个条目。

当这两个声明相互满足时,第一个声明具有更高的优先级,因此 MyDerived 获得了 LibBase 的 2 个实现。但是 c++ 的强大功能是解决它的可能性!只需重写 MyDerived 虚函数即可选择要使用的虚函数。或者另一种方法 - 创建从聚合任何实例的接口(interface) LibBase 派生的 MyDerived 的通用包装器:LibDerived、MyBase,...并从聚合调用预期的方法。

关于c++ - C++ 中的非对称虚拟继承菱形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1245445/

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