#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();
}
答案 0 :(得分:0)
基类中的成员函数是const限定的,而不是派生类。
所以这些通过继承不是相同的功能。你已经声明了一个新的虚函数,而不是覆盖第一个虚函数。
将const
添加到第二个,以便它实际覆盖基类函数。
请记住,对于虚拟函数覆盖启动,有一些条件可以实际满足。他们必须:
如果不满足任何条件,则为编译器创建一个非常相似但不同的函数。
使用C ++ 11,你应该使用override
来覆盖你想要覆盖的函数,这样编译器就会知道你的意图,并告诉你你犯了一个错误。 E.g:
virtual bool legal_movement(int source[], int dest[]) override;
// ^^^^^^^^