我正在制作一个Pacman游戏,其中我有几个类,包括Board(通过它的指针完成所有工作),Chase(继承自Ghosts)。现在我已经在Ghosts中创建了一个虚拟的“追逐”功能,这个功能在其子项中被重写,即Chase类。另外,在Board中我有Ghosts对象数组(显然是四个大小)。我还在Board中制作了一个“追逐”功能,它实际上调用了第一个幽灵的追逐,反过来(这是我困惑的地方)进入其子类的访问。请帮助我,因为它不能像我想要的那样工作。
我想在这里做一个详尽的解释: 1)通过Board的类指针,我几乎完成了所有的工作。这意味着我的Ghosts类在我的Board类中是COMPOSED。 Board具有chase功能,GHOST对象在其中调用其VIRTUAL chase功能。 2)Chase CLASS派生自Ghost类,并包含一个chase函数。 我必须通过指针板调用这个Chase CLASS追逐函数。
Ghosts(int x = 0, int y=0)
{
protected:
x_pos = x;
y_pos = y;
}
virtual void chase(char bD)
{
}
class Chase : public Ghosts
{
public:
Chase() :Ghosts(){}
void chase(char bD)
{
// access x_pos;
// access y_pos;
}
class Board {
private:
Ghosts G[4];
public:
void Chase(char bD)
{
G[0].chase(bD);
}
答案 0 :(得分:2)
你的问题在于了解如何使用多态, 在你的情况下,多态性在引用和指针上起作用,它们都不是。 让我们来探索它:
class A {
public:
virtual ~A() {};
virtual void chase(char bd) { cout << "A chases : "<< bd << endl; }
};
class B : public A {
public:
void chase(char bd) override { cout << "B chases : " << bd << endl; }
};
在主要或w / e:
A a, *aptr;
B b;
a.chase('s');
b.chase('s');
aptr = &b;
aptr->chase('s');
a = b;
a.chase('s');
A &ref = b;
ref.chase('s');
...将会: 追逐:s
B追逐:s
B追逐:s
追逐:s
B追逐:s
为什么呢?在这两个多态中从未使用过它的常规对象&#34; a.chase(&#39; S&#39); b.chase(&#39; S&#39);
aptr =&amp; b; &lt; -we给了aptr b对象的地址 因为追逐是虚拟的,现在多态性开始了 aptr-&GT;追(&#39; S&#39);
与参考文献相同: aptr =&amp; b; aptr-&GT;追(&#39; S&#39);
但你所做的实际上是这样的: a = b;在这里b复制它&#34; A&#34;因为一个人不能持有&#34; B&#34;部分 只要它认为b是A对象,它就不会持有它 a.chase(&#39; S&#39);所以这将产生A追逐而不是B追逐
所以提示:多态可以用于:指针(智能指针或我在我的例子中使用的原始指针)或引用。 如果你想使用多态功能,如果你使用指针/引用
,它会做另一个提示是使用覆盖来通知编译器你正在覆盖&#34;父母&#34;函数当你有不好的参数等时会帮助你(会产生正确的编译错误等等)
并且最重要的事情之一就是让你的析构函数在虚拟基类中确保没有僵尸会出现
答案 1 :(得分:2)
您的Board
类包含一组Ghost
个对象,而不是Chase
个对象。因此G[0].chase(bD);
始终会Ghost::chase()
,而不是Chase::chase()
。仅仅因为定义 Chase
中的覆盖并不意味着它会在使用Ghost
的任何地方自动使用。只有在指向派生类型的对象的基类类型的指针/引用时,多态才有效。你的代码没有那个。要解决此问题,请使您的数组保持指向Ghost*
个对象的Chase
指针。例如:
class Board
{
private:
Ghosts* G[4];
public:
Board()
{
for (int i = 0; i < 4; i++)
G[i] = new Chase;
}
~Board()
{
for (int i = 0; i < 4; i++)
delete G[i];
}
void Chase(char bD)
{
G[0]->chase(bD);
}
};