【问题标题】:Calling subclass methods from superclass object, virtual functions从超类对象、虚函数调用子类方法
【发布时间】:2016-01-22 10:15:44
【问题描述】:

我正在设计一个国际象棋游戏(C++ 初学者),但是我一直在检查单个棋子类型的过程,例如典当一次只移动 1 个空格,除了第一次移动 2 个空格,等等。

我有一个棋子类,它的子类是pawn、king等,其中包含方法:

check(string position,string destination);

并返回一个布尔值是否可以移动到目的地。

我有一个指向我通过执行定义的每个部分的指针:

pawn pawnPieces[16];
piece *pointer[16];

for (i=0;i<16;i++)
{
    pointer[i]=&pawnPieces[i];
}

在我最初的检查之后,我想从 main 调用上面的检查函数,作为测试:

cout << pointer[1]->check("B1","C1") << endl;

这给了我一个错误“没有名为'check' in piece的成员”,这是有道理的,但是我确信有一种方法可以将piece类链接到pawn、king等。

我认为我需要根据我阅读的内容对虚拟函数做一些事情,但我不知道如何处理这个问题。如果有人能提供一些建议,将不胜感激。

这种尝试从指向它上面的类的指针调用子类函数的方法可能存在根本缺陷,也许我需要修改我的设计来实现这个目标?我还是想把pawn类的check方法保持在同一个位置,因为我相信它封装得很好。

编辑:我在片断类中做了一个纯虚函数:

virtual bool check(string positionIN,string destination)=0;

现在当我调用上面的 cout 行时,我遇到了分段错误,我不确定为什么。我假设这是因为我使用了指针?

EDIT2:谢谢!我已经实现了这个,但是我遇到了一个小错误,虚拟是要附加到 pawn 和 king 类吗?据我了解,我认为虚拟标签只在基类上。

EDIT3:我明白了,我用虚拟标签在 pawn 和 king 类中标记了 check 函数并编译了它。

现在我通过调用对象本身遇到了分段错误

pawnPieces[1].check("B1","C1") 

并通过调用指向对象的指针

pointer[1]->check("B1","C1") 

来自 main,我不知道为什么。

EDIT4:现在一切正常,我从 main 调用它来测试,但是当我从我的程序中调用它时,一切正常,谢谢大家!

【问题讨论】:

  • 好吧,分别查找 interfacesvirtual ,纯 virtual
  • 虚拟/纯方法绝对是要走的路。在piece 中声明check(),并在pawnking 等中覆盖它。如果仍然有问题,请出示您的实际代码。
  • 编辑 2:它只 需要 在基类中,但我更喜欢在所有这些(以及override)中使用它来实现它更明显。

标签: c++ class inheritance polymorphism subclass


【解决方案1】:

您尝试做的正是 virtual 方法的用途。

class piece
{
public:
    virtual bool check(string position, string destination) = 0;
};

class pawn : public piece
{
public:
    virtual bool check(string position, string destination)
    {
        return ...;
    }
};

class king : public piece
{
public:
    virtual bool check(string position, string destination)
    {
        return ...;
    }
};

【讨论】:

  • 非常感谢,我开始有所收获了!
猜你喜欢
  • 2017-05-13
  • 2011-04-02
  • 2020-05-03
  • 1970-01-01
  • 2014-05-29
  • 2019-06-10
  • 1970-01-01
  • 2011-01-05
  • 2011-10-24
相关资源
最近更新 更多