【问题标题】:chess game - error in abstract class国际象棋游戏 - 抽象类中的错误
【发布时间】:2015-12-06 16:33:57
【问题描述】:
#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;
};

我正在尝试创建国际象棋游戏,所以我为国际象棋工具创建了抽象类(皇后、国王、车...) 我还创建了 king 工具来检查我的代码:

#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();
}

【问题讨论】:

  • 尝试编译你的代码。 IntelliSense 错误可能是由于代码尚未编入索引。
  • 你知道你在使用私有继承吗?

标签: c++ abstract chess


【解决方案1】:

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

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

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

请记住,要启动虚函数覆盖,实际上需要满足一些条件。他们必须:

  • 同名
  • 返回类型相同
  • 相同的参数计数和类型
  • 相同的 const 限定(我们这里的例子)
  • 其他一些小事(例如,兼容的异常规范)

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

在 C++11 中,您应该使用 override 来表示要覆盖的函数,这样编译器就会知道您的意图并告诉您您犯了一个错误。例如:

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

【讨论】:

  • 现在尝试运行程序时:Manager::Manager() { Chess_tool *b = new King("black", 'p'); _board[0][0] = b;它告诉我: - IntelliSense:不允许转换为无法访问的基类“Chess_tool” - 错误 C2243:“类型转换”:从“King *”到“Chess_tool *”的转换存在,但无法访问
  • 这就是@juanchopanza 告诉你的(我没有注意到),你正在使用私有继承。这不会在您的类之间创建“is-a”关系,这对于多态性是强制性的,而是“has-a”。查看如何进行正确的继承以更彻底地理解这一点。
猜你喜欢
  • 1970-01-01
  • 2016-04-04
  • 1970-01-01
  • 2015-05-02
  • 2015-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多