【发布时间】:2014-11-05 05:44:04
【问题描述】:
这不是关于如何做某事的问题,我对虚拟继承了如指掌,并且我知道一些规避这个问题的方法 - 但没有一个是我满意的。
这是一些无法编译的代码:
struct BottomClass
{
BottomClass(int& ref) : ref(ref) {}
int& ref;
};
struct MiddleClassA : virtual public BottomClass
{
MiddleClassA() /*: BottomClass()*/ {}
virtual ~MiddleClassA() = 0;
};
MiddleClassA::~MiddleClassA(){}
struct MiddleClassB : virtual public BottomClass
{
MiddleClassB() /*: BottomClass()*/ {}
virtual ~MiddleClassB() = 0;
};
MiddleClassB::~MiddleClassB(){}
struct TopClass final : public MiddleClassA, public MiddleClassB
{
TopClass(int& ref) : BottomClass(ref) {}
};
void main()
{
int someInt;
TopClass variable(someInt);
}
困扰我的是为什么它不能编译。我知道 BottomClass 没有默认构造函数,因此 MiddleClassX 格式不正确。但是 MiddleClassX 是抽象类!即使我在那里指定了一个构造函数,它在任何情况下都不会被使用......那我为什么要指定呢?
我什至不能在那里给出一个合理的构造函数,因为 MiddleClassX 没有任何合理的值可以赋予 BottomClass。
我的问题是:这个问题有没有优雅的解决方案?
我自己有一些解决方案,但我不喜欢其中任何一个:
1) 我可以创建一个 BottomClass 默认构造函数,它使用一些垃圾值来构造它的 ref。然后 assert() 在那个构造函数中,所以我知道它永远不会被调用......当然这导致我不得不对所有应该是编译时错误的东西进行运行时检查,而且它实际上也需要存在获取引用的垃圾整数。
2)我可以将引用传递给每个抽象的中产阶级并使用它......但这会导致信息的严重重复,并且当这些链变长时(就像它们那样),维护它是非常乏味的。必须向每个类传递一个额外的变量也会对性能造成影响。
(如果我的问题难以理解,我深表歉意 - 如果有人能更好地描述我的困境,那就太棒了,我很难用语言表达)
【问题讨论】:
标签: c++ inheritance abstract-class virtual-inheritance