如何使子类的基类调用重写函数

时间:2019-12-18 20:48:09

标签: c++ class oop inheritance

我有一个班级名称Piece,其中有许多子班,例如RookKnightKing等。 类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);
};

3 个答案:

答案 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和其他参数的另一个函数,它可以工作,但是开发人员会感到困惑。