【发布时间】:2018-10-06 03:09:21
【问题描述】:
假设我有一个继承自 I、S1 和 S2 的 C 类。假设 I 只是一个接口,而 S1 和 S2 是没有函数的简单结构。没有一个类/结构共享任何公共成员或方法,也不继承任何其他东西。
保证不会出现钻石等级等问题。结构的目的只是提供组合的替代方案。
代码如下所示:
class C : public I, public S1, public S2
{
...
};
现在,这样做的有用之处在于,只要我需要一个只是其中一部分的对象,我就可以简单地将 C 的实例转换为 S1 或 S2。关键是使用现有的 C 作为 S1 或 S2(甚至是 I)很简单(而且很有用)。
但是,在该用例之上,我还希望能够在提供 S1 对象和 S2 对象时创建 C 的新实例。第一个(也是唯一一个)想到的是一个构造函数,它可以像这样工作:
C::C(const S1& s1, const S2&s2) : I(), S1(s1), S2(s2)
{
...
}
但是,该解决方案存在三个问题:
- 它需要我的附加代码和附加构造函数 C 类非常不雅,我认为必须有一个 更好的方法。
- 它要求我的结构 S1 和 S2 提供复制构造函数(或移动构造函数,如果实现方式不同)。虽然这对我来说很好,即使使用默认构造函数,这清楚地表明这不是一个通用的解决方案,因此很糟糕或至少不完整。
- 由于框架的设计以及我在其中制作的应用程序,此解决方案将需要比仅在准系统示例中更多的功能和代码。再一次,编写代码并不是什么大问题,只是需要维护和思考更多的代码。最重要的是,在 C 中使用带有 S1 和 S2 实例的简单组合最终会变得相当冗长,甚至更少。
所以,总结一下:
当我们已经完成了这些类的对象(或者只是制作它们所必需的东西,甚至)时,有哪些可能的方法来创建一个从某些类继承的对象?
在那些最普遍、最简单和最不可能导致头痛和并发症的方式中,它们是逻辑上的还是句法上的?
【问题讨论】:
-
如果你想继续使用组合并且仍然希望你的类型可以隐式转换为它的组件类型,你可以实现隐式user defined conversions。
-
确实如此,但这不是我决定放弃作曲的原因。这是在我的类中拥有 S1 和 S2 实例的语法开销。 S1 和 S2 在设计中是非常原始的构建块(并且在多个地方都需要),我很快就变得非常恼火,因为我必须不断编写一些东西.x 只是为了得到我在基本上 80% 的成员函数中使用的 x .此外,“x”也用于许多循环条件,我不喜欢在其中包含这样(相对)复杂和长的表达式。我更喜欢我的循环只是
-
您能描述一下您想象的在理想世界中创建
C的样子吗?我不清楚你在找什么。 -
您可以为
C提供赋值运算符,一个以S1和一个以S2作为参数来支持它。 -
@user8145466
static_cast<S1&>(C) = someS1;会这样做。如果没有引用,您将从C创建一个临时的S1并尝试分配给它。
标签: c++ constructor multiple-inheritance