国际象棋游戏 - 抽象类中的错误

时间:2015-12-06 16:33:57

标签: c++ abstract chess

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


class Chess_tool
{
public:
    Chess_tool(string color, char name); 
    virtual bool legal_movement(int source[], int dest[]) const = 0;

private:
    string _color;
    char _name;
};

我正在尝试创建国际象棋游戏,因此我为国际象棋工具创建了抽象类(女王,王,车......) 我还创建了王工具来检查我的代码:

#pragma once

#include "Chess_tool.h"

class King : Chess_tool
{
public:
    King(string color, char name);
    virtual bool legal_movement(int source[], int dest[]);
};

我创建了game_board类:

#pragma once
#include "Game_board.h"
#include "Chess_tool.h"
#include <iostream>

#define BOARD_SIZE 8
using namespace std;

class Chess_tool;
class Game_board
{
public:
    Game_board();
    ~Game_board();
    void move(string panel);


protected:
    Chess_tool* _board[BOARD_SIZE][BOARD_SIZE];
};

问题出在这里,当我尝试将对象添加到矩阵时,它显示错误:     1 IntelliSense:不允许抽象类类型为“King”的对象:             纯虚函数“Chess_tool :: legal_movement”没有覆盖

#pragma once
#include "Chess_tool.h"
#include "Game_board.h"
#include "King.h"
using namespace std;

enum Turn { WIHTE, BLACK };

class Manager : Game_board
{
public:
    Manager();
    ~Manager();
    virtual bool legal_movement(int source[], int dest[]) const = 0;
};

....

#include "Manager.h"
Manager::Manager()
{
    _board[0][0] = new King();
}

1 个答案:

答案 0 :(得分:0)

基类中的成员函数是const限定的,而不是派生类。

所以这些通过继承不是相同的功能。你已经声明了一个新的虚函数,而不是覆盖第一个虚函数。

const添加到第二个,以便它实际覆盖基类函数。

请记住,对于虚拟函数覆盖启动,有一些条件可以实际满足。他们必须:

  • 同名
  • 相同的返回类型
  • 相同的参数count和type
  • 相同的const-qualification(我们的情况在这里)
  • 一些其他小事(例如,兼容的例外规范)

如果不满足任何条件,则为编译器创建一个非常相似但不同的函数。

使用C ++ 11,你应该使用override来覆盖你想要覆盖的函数,这样编译器就会知道你的意图,并告诉你你犯了一个错误。 E.g:

virtual bool legal_movement(int source[], int dest[]) override;
//                                                    ^^^^^^^^