所以我有这个想法,我认为用C++实现基本上是不可能的......但我想问一下。我通读了 Stroustrup 的第 15 章并没有得到我的答案,而且我认为关于继承钻石的其他十亿个问题也无法回答这个问题,所以我在这里问。
问题是,当您从两个共享一个公共基类的基类继承时会发生什么,但是这两个基类中只有一个虚拟继承自它。例如:
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
对象?
我希望这个问题足够清楚。