【发布时间】: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