【发布时间】:2014-08-23 23:31:26
【问题描述】:
我很难在标题中简洁地描述这个问题,所以如果你理解这个问题并且有一个更好的标题,请推荐。
我已经制作了我的问题的精简版本,它尽可能小,因此所有函数都是内联定义的,所以请原谅,实际代码不是这样的。
这是我的结构:
class iobject
{
public:
virtual bool isValid (void) = 0;
};
class object : virtual public iobject
{
public:
object (void) { }
virtual ~object () {}
virtual bool isValid (void) { return true; }
};
上面,一个简单地跟踪对象是否有效的接口 + 实现......假设引擎/系统中的所有对象都将派生自这个单个对象。
class ibase : public virtual iobject
{
public:
virtual void show (void) = 0;
};
class base : public virtual object,
public virtual ibase
{
public:
base (int value) : object() { m_value = value; }
virtual ~base () {}
virtual void show (void) { std::cout << m_value << std::endl; }
private:
int m_value;
};
现在我有一个假设的类,它只是存储一个数字并打印它。它来源于对象。这样“钻石”就完成了。
class derived1 : public virtual base
{
public:
derived1 (int value) : base (value) {}
virtual ~derived1 () {}
};
现在我从基类派生。关于这个派生类需要注意的是,我有与基类相同的构造函数参数(int 值)。
class derived2 : public virtual derived1
{
public:
derived2 (void) : derived1 (15) {}
virtual ~derived2 () {}
};
最后我从这个派生类派生。但是,请注意,此类没有任何构造函数参数。相反,这个类在内部应该知道这个例子中的值应该是 15。
我的期望是,当我实例化 derived2 时,它会用值 15 构造 derived1 并将其传递给对象。我希望做到以下几点:
derived1 works(1234);
derived2 doesNotWork;
works.show();
doesNotWork.show();
但是当我尝试这样做时,我得到:
error C2512: 'base::base' : no appropriate default constructor available
如果我添加一个空的 base::base 构造函数,那么我最终会得到未定义的 m_value (但还是尝试了)
我似乎遗漏了一些明显的东西...,有人可以强调一下吗?
【问题讨论】:
标签: c++ interface multiple-inheritance diamond-problem