我正在尝试在C++中进行类继承,但是显然它的工作方式与Python中的工作方式大不相同。

现在,我有两个类,一个叫Player是基类,另一个叫HumanPlayer是子类。
Player类是一个抽象类,它具有两种工作方式。

首先是它的行为像单例。它具有一个称为make_move的静态函数,人们可以使用intTicTacToeGame&调用该函数,并且它将使用该int作为该TicTacToe游戏中的玩家编号的玩家的举动。

第二个方面是,它用作创建具有玩家编号作为属性的对象的类。因此,如果使用该类构造对象,则应使用player_number属性返回一个对象。然后,如果仅在对象上带有make_move的情况下调用TicTacToeGame&函数,它将自动插入其玩家编号并使用静态类方法在游戏中移动。

我想要HumanPlayer的功能相同,只是我只想为HumanPlayer编写一个新的静态功能,就是这样,因为其他功能保持不变。

这是代码:

#include <iostream>
#include <string>
using namespace std;

class TicTacToeGame {

};

class Player {
    public:
        static void make_move(int player_number, TicTacToeGame& game);

    protected:
        int player_number;

    public:
        explicit Player(int player_number_param) {
            player_number = player_number_param;
        }

    public:
        void make_move(TicTacToeGame& game) {
            return make_move(player_number, game);
        }
};

class HumanPlayer: public Player {
    public:
        static void make_move(int player_number, TicTacToeGame& game) {}

    public:
        HumanPlayer(int player_number_param): Player(player_number_param) {}
};

int main()
{
    TicTacToeGame game;
    HumanPlayer human_player = HumanPlayer(2);
    human_player.make_move(game);
    return 0;
}

我最近了解到,子类不继承构造函数,因此事实证明,我必须编写一个新的静态函数和一个构造函数,这已经完成。
但是,每当我初始化一个新的HumanPlayer对象时,编译器似乎都找不到make_move(TicTacToeGame&)方法的匹配项,我不确定为什么。

我收到的特定错误消息是



如何使HumanPlayer类以与Player类相同的方式工作?

最佳答案

重新定义具有相同名称的静态函数将隐藏您要使用的静态函数。

重新命名或添加

public:
    using Player::make_move;

请注意,与Java不同,您不需要在每个函数之前都重复public:,只要不更改它,就可以应用相同的可见性。
class YourClass {
public:
    void foo1(); // public
    void bar1(); // also public
protected:
    void foo2(); // protected
    void bar2(); // also protected
};

关于c++ - 为什么编译器找不到父类(super class)的方法?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50498938/

10-12 18:18