关于c ++:为什么编译器找不到超类的方法?

Why can't the compiler find the superclass's method?

我试图在C++中继承类继承,但是它显然与Python有很大的不同。

现在,我有两个类,一个称为Player,即基类,另一个称为HumanPlayer,即子类。

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

首先,它的行为就像一个单身汉。它有一个静态功能叫make_move,人们可以用intTicTacToeGame&来调用它,它将以该int作为该TicTacToe游戏中玩家的号码为玩家移动。

第二个问题是,它作为一个类工作,用于创建具有播放器编号作为属性的对象。因此,如果用类构造一个对象,那么应该返回一个具有player_number属性的对象。然后,如果只在对象上使用TicTacToeGame&调用make_move函数,它将自动插入其玩家编号,并使用静态类方法在游戏中进行移动。

我希望HumanPlayer具有相同的功能,但我只想为HumanPlayer编写一个新的静态函数,就是这样,因为其他功能保持不变。

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#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:\Users\London\Desktop\Python
Programs\LearningC++\FirstProgram_SO.cpp: In function 'int main()':
C:\Users\London\Desktop\Python
Programs\LearningC++\FirstProgram_SO.cpp:41:29: error: no matching
function for call to 'HumanPlayer::make_move(TicTacToeGame&)'
human_player.make_move(game); ^ C:\Users\London\Desktop\Python
Programs\LearningC++\FirstProgram_SO.cpp:29:15: note: candidate:
static void HumanPlayer::make_move(int, TicTacToeGame&) static void
make_move(int player_number, TicTacToeGame& game) {} ^~~~~
C:\Users\London\Desktop\Python
Programs\LearningC++\FirstProgram_SO.cpp:29:15: note: candidate
expects 2 arguments, 1 provided

我怎样才能让HumanPlayer类以与Player类相同的方式工作?


对同名静态函数的重新定义将隐藏要使用的静态函数。

要么以不同的方式重命名,要么添加

1
2
public:
    using Player::make_move;

注意,与Java不同的是,在每个函数之前不需要重复EDCOX1×0,只要你不改变它,同样的可见性就可以应用。

1
2
3
4
5
6
7
8
class YourClass {
public:
    void foo1(); // public
    void bar1(); // also public
protected:
    void foo2(); // protected
    void bar2(); // also protected
};