我有一个班级名称Piece
,其中有许多子班,例如Rook
,Knight
,King
等。
类Piece
有一个名为Move(int x, int y)
的虚函数,所有子类都继承了该函数。
现在,我有了另一个函数,我们称之为foo(Piece& src, Piece& dest)
。 foo()
以此方式调用函数move()
:
int foo(Piece& src, Piece& dest)
{
int moveCode = src.move(dest.getX(), dest.getY());
// Rest of the code ...
}
函数foo()
有时会获得knight
类作为参数,King
类或其余的子类。
我的问题是,当我调用move()
时,我希望它从子类中调用重写的move
函数,而不是从move
基类中调用Piece
类。
有什么方法可以使src.move()
调用子函数?
Piece.h:
class Piece
{
protected:
int _pieceTypeIndex;
int _pieceColor;
int _x;
int _y;
public:
Piece();
Piece(int x, int y);
Piece(int x, int y, int pieceTypeIndex, int pieceColor);
virtual int move(int dest_x, int dest_y);
int getPieceTypeIndex() const;
int getPieceColor() const;
void setPieceTypeIndex(int pieceTypeIndex);
void setPieceColor(int pieceColor);
int getX();
int getY();
void setX(int x);
void setY(int y);
Piece& operator=(Piece& other);
};
子类代码(Rook.h):
class Rook : public Piece
{
public:
Rook(int x, int y, int pieceTypeIndex, int pieceColor);
virtual int move(int dest_x, int dest_y);
};
答案 0 :(得分:0)
签名不同。它们必须相同。您的Rook
必须成为这样:
class Rook : public Piece
{
public:
Rook(int x, int y, int pieceTypeIndex, int pieceColor);
virtual int move(int dest_x, int dest_y);
};
验证您是否正确执行操作的一个好技巧是使用关键字override
。
class Rook : public Piece
{
public:
Rook(int x, int y, int pieceTypeIndex, int pieceColor);
virtual int move(int dest_x, int dest_y) override;
virtual int move(int dest_x, int dest_y, Board& board) override; //Wouldn't compile
};
答案 1 :(得分:0)
如何使子类的基类调用重写函数
您可以简单地调用它-如果基类不知道如何执行任务的任何部分,则使该函数成为纯虚函数(这也使您的基类变得抽象-无法实例化,这是一个好东西)。也请尽量避免使用幻数。命名所有可以简化代码的东西。
在这种情况下,您还可以依赖隐式创建的副本构造函数/赋值运算符。基类内部使用的所有类型都是可复制的。
这里是一个示例,说明如何将move()
函数拆分为一个基类部分和只有派生类可以处理的部分,移动的验证并具有基类{{1} }在派生类中调用move()
。
validate_move()
答案 2 :(得分:-1)
您需要在 base 类中声明相同的函数/方法,将该函数标记为virtual
,然后在子类中重新声明该函数,并用{{ 1}}和virtual
关键字。
override
但是,这不能在“ C ++”中的构造方法中完成。
**Pieces.hpp**
class Piece
{
// ...
public:
virtual int move (int x, int y);
void start(int x, int y);
// ...
} // class
class Rook : public Piece
{
// ...
public:
virtual int move (int x, int y) override;
// ...
} // class
**Pieces.cpp**
void piece::start(int x, int y)
{
this::move(x, y);
} //
您还可以使用具有相同ID和其他参数的另一个函数,它可以工作,但是开发人员会感到困惑。