- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我目前正在从事 C++ 设计,其中我具有以下继承结构:
A
/ \
B C
类 A
执行两个类共有的计算 B
和 C
和类 B
和 C
有两种不同的初始化方式 A
.
我想添加某种混合初始化,即类 D
将使用 B
中的方法和 C
.
但是,我需要使用菱形继承(钻石问题)才能访问 B::init()
和 C::init()
设置 D
的属性.
我知道我可以使用虚拟继承来避免菱形问题,但是我遇到了运行时错误,而我手动复制方法时不会遇到这些错误。此外,我在尝试实例化类时遇到问题 B
和 C
,一位同事建议我永远不要在我的设计中使用菱形继承。
因此,我想找到某种“干净”的解决方法,但我一直没能做到。
我可以将所有初始化例程放在类 A
中, 但目前它们很好地分开了,我想避免有一个大类,在那里我无法真正分离类的不同功能组 B
和 C
.回答后编辑:这是我选择的,使用不同的 cpp 文件将我的“大”类拆分为逻辑方法组。
我还可以删除继承链接并用友元替换它们,其中 B
的方法和 C
是静态的并且处理类型为 A*
的指针.这样,我可以调用 B::init(A* a)
和 C::init(A* a)
来自 D::init(A* a)
.但是,我必须替换 _fooAttribute
的所有用途通过 a->_fooAttribute
,这有点麻烦,似乎也不对。
你会推荐什么?
最佳答案
如果您的设计需要菱形继承,那么这就是您需要做的。人们将它视为 C++ 的“不得使用”功能,但事实是它就在那里,它是完全定义的(如果理解起来有点复杂),如果您的问题空间需要它,您应该使用
特别是,我无法理解这是否确实是菱形继承(钻石问题)。特别是 B
中的 A
和 C
中的 A
是否相同 <A
的 em>实例?从您的问题看来,事实并非如此。 B
和 C
都有某种不同的方式来初始化 A
。如果是这样的话,这就不是菱形继承(钻石问题)了。只需确保 B
和 C
在非虚拟继承中继承 A
。
话虽如此,请确保这确实是您的设计所要求的。你能诚实地说 B
是一个 A
吗?那个 C
?你能诚实地说 D
既是 B
又是 C
吗?如果不是,可能使 A
成为 B
、C
或两者的成员,或者使 B
或
成员更有意义。D
的 C
如果您从 A
继承的唯一原因是作为扩展 A
提供的方法的一种方式,那么考虑简单地使这些方法成为 的成员一个
。如上所述,虽然减少代码重复是一项有值(value)的事业,但设计应确保继承关系是一种是一种关系。偏离这一点就是自找麻烦。
关于c++ - 我怎样才能避免菱形继承(钻石问题)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38267016/
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 这个问题是由于错别字或无法再重现的问题引起的。虽然类似的问题可能是on-topi
我有几个 div,我想将它们旋转成菱形,但我不希望它们的背景图像旋转,我该如何实现?这是我现在的代码 dj-1-overlay.png" /> 和我的 CSS: #diamonds div { -
我正在制作 Canvas 动画,其中一个图像应该是钻石。 现在,我做到了这一点: ctx[0].beginPath(); ctx[0].moveTo(0,-80); ctx[0].lineTo(-60
考虑以下几点: #include #include using namespace std; class A { public: A(const char* sName) //convers
以某种方式检测 charuco 钻石对我来说不适用于更大的图像。使用我的 1920x1080 原始图像,它既不能可靠地识别 id(菱形 id 元素每次都在切换位置)。在第一张图片中,您可以看到它识别出
下面的代码是关于菱形继承(钻石问题)的。虚拟继承解决了这种歧义。 #include using namespace std; class A { public: voi
我目前正在开发 2D 等距 map 编辑器。我显示包含点和纹理的实体(立方体,播放器)。每个立方体由12个点组成。(12个点,但在sfml(sf::VertexArray)显示时作为4个点的3条边处理
如何在 iOS 的 openframeworks 中构建 3d 钻石?我很难在 openframeworks 中找到有用的 3d 渲染教程,我来自 Processing。 最佳答案 我认为这个故事有两
我是一名优秀的程序员,十分优秀!