c ++钻石继承仅由基础构造函数构造

时间:2018-05-18 03:12:20

标签: c++ multiple-inheritance diamond-problem

enter image description here

我很难构建我的女王班,使用这个基础类,我有虚拟我的车和主教类,以防止重复的问题。现在我得到了错误声明Rook和Bishop是虚拟的,它没有默认的构造函数。

这里是我的班级声明

class Piece
{
public:
  Piece(Colour c, const Position& pos);
  virtual ~Piece();
private:
  Colour piece_colour;
  Position piece_pos;
};
class Bishop: public virtual Piece
{
public:
  Bishop(Colour c, const Position& pos);
  ~Bishop();
};

class Rook: public virtual Piece
{
public:
  Rook(Colour c, const Position& pos);
  ~Rook();
};

#ifdef MSC_VER
class Queen: public virtual Piece, public Bishop, public Rook
#else
class Queen: public Bishop, public Rook
#endif
{
public:
  Queen(Colour c, const Position& pos);
  ~Queen();
};

这是我的工具

Piece::Piece(Colour c, const Position& pos)
:piece_colour{c}, piece_pos{pos}
{

}

Bishop::Bishop(Colour c, const Position& pos)
:Piece(c,pos)
{

}

Rook::Rook(Colour c, const Position& pos)
:Piece(c,pos)
{

}

Queen::Queen(Colour c, const Position& pos)
:Piece(c,pos)
{

}

1 个答案:

答案 0 :(得分:0)

请记住,在构造Queen对象时,该对象包含Rook个对象和Bishop个对象。在构造Queen对象时,还必须构造这两个对象。

由于您的代码当前已编写,编译器将尝试调用默认构造函数Bishop()Rook()来实例化这些对象。

但您的代码未定义Bishop()Rook()构造函数 - 因此您会收到错误消息,告知您BishopRook类没有默认值构造函数定义。

解决问题的一种方法是定义默认构造函数Bishop()Rook()以及默认构造函数Piece() ...

protected:
   Piece::Piece()   { }
   Bishop::Bishop() { }
   Rook::Rook()     { }

...如果你这样做,你将要构建那些构造函数protected,这样它们只能从派生类中调用。

另一种方法是更改​​Queen构造函数,以显式调用已定义的BishopRook构造函数...

Queen::Queen(Colour c, const Position& pos)
   : Bishop(c, pos), Rook(c, pos), Piece(c, pos)

如果您的Bishop(c, pos)Rook(c, pos)构造函数真正起作用,那么第二种方法是唯一真正的解决方案(假设实际工作取决于传递给它们的颜色和位置参数)。