【问题标题】:c++ diamond inheritance construct only by base constructorc ++菱形继承构造仅由基本构造函数
【发布时间】:2018-05-18 03:12:19
【问题描述】:

我无法使用基类来构建我的皇后类,我有虚拟的车和主教类,以防止重复问题。现在我收到错误消息,指出 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)
{

}

【问题讨论】:

  • Queen的构造函数必须调用Rook的构造函数和Bishop的构造函数。
  • 另外,这是对继承的错误使用。继承应该表示“是”关系。
  • 虽然我可能没有想到要从 rook 和 bishop 派生出 Queen,但我不确定我是否明白对这种继承的技术反对意见是什么。 Rook 是一个可以沿行列或文件移动任意数量的方格的棋子。 Bishop 是一块可以沿对角线移动任意数量的方格的棋子。根据这些定义,女王确实“是”车,“是”主教。这是否是对继承的不寻常使用尚有争议,但不正确是一个强有力的词。这里实际上有什么不正确的?

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


【解决方案1】:

请记住,当您构造一个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) 构造函数真正起作用,那么第二种方法是唯一真正的解决方案(假设实际工作取决于传递给它们的颜色和位置参数)。

【讨论】:

  • 我建议使用第二个选项。为片段引入默认构造函数涉及对位置和颜色进行默认选择。没有明智的选择,因此最好避免使用默认构造函数,考虑到这个简单的替代方案。
猜你喜欢
  • 2013-07-05
  • 2017-11-17
  • 2019-01-21
  • 2013-06-01
  • 2023-04-03
  • 2013-12-24
相关资源
最近更新 更多