为什么编译器无法找到超类的方法?

时间:2018-05-23 23:41:39

标签: c++ methods abstract-class superclass subclassing

我试图在C ++中进行类继承,但它显然与Python中的方式非常不同。

现在,我有两个类,一个名为Player,它是基类,另一个名为HumanPlayer,是子类。

Player类是一个抽象类,有两种工作方式。

首先,它就像一个单身人士。它有一个名为make_move的静态函数,人们可以通过intTicTacToeGame&来调用它,它会为那个int作为播放器的玩家提供一个动作&# 39; 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&)方法的匹配项,我不确定原因。

我得到的具体错误信息是

  

C:\用户\伦敦\桌面\的Python   Programs \ LearningC ++ \ FirstProgram_SO.cpp:在函数&#39; int main()&#39;:   C:\用户\伦敦\桌面\的Python   Programs \ LearningC ++ \ FirstProgram_SO.cpp:41:29:错误:没有匹配   呼叫&#39; HumanPlayer :: make_move(TicTacToeGame&amp;)&#39;   human_player.make_move(游戏); ^ C:\ Users \ London \ Desktop \ Python   程序\ LearningC ++ \ FirstProgram_SO.cpp:29:15:注意:候选人:   static void HumanPlayer :: make_move(int,TicTacToeGame&amp;)static void   make_move(int player_number,TicTacToeGame&amp; game){} ^ ~~~~   C:\用户\伦敦\桌面\的Python   程序\ LearningC ++ \ FirstProgram_SO.cpp:29:15:注意:候选人   需要2个参数,1提供

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

1 个答案:

答案 0 :(得分:2)

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

以不同方式重命名或添加

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
};
相关问题