我调用的函数不是通过多态访问子类的函数
Function i'm calling is not accessing child class's function through Polymorphism
我正在制作一款吃豆人游戏,我有几个类,包括Board(通过指针完成所有任务)、Chase(从Ghosts继承而来)。现在我在Ghosts中制作了一个"chase"的虚拟函数,该函数在其子级(即chase类)中被覆盖。此外,在Board中,我有一个对象的Ghosts数组(显然是四号)。我还在Board中做了一个"chase"函数,它实际上调用了第一个ghost的chase,然后(这是我感到困惑的地方)进入其子类进行访问。请帮我解决这个问题,因为它没有像我希望的那样工作。
我想在这里做一个全面的解释:1) 通过Board的课堂指针,我几乎完成了所有的工作。这意味着我的Ghosts课程在我的Board课程中是COMPOSED。Board有一个追逐函数,其中GHOST对象调用其虚拟追逐函数。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);
}
您的问题在于理解如何使用多态性,多态性在引用和指针上都有效——在您的情况下,两者都不起作用。让我们来探索一下:
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');
将会:A追逐
B追逐:s
B追逐:s
A追逐
B追逐:s
为什么?在这两个多态性中,它是一个"规则对象"a.相位;b.追逐;
aptr=/b<-我们给aptr一个b对象的地址既然追逐是虚拟的,多态性就开始了aptr->chase('s');
参考文献也是如此:aptr=/b;aptr->chase('s');
但你实际上是这样做的:a=b;这里b把它的"A"部分复制到A中,但由于A不能容纳"b"部分它并没有像它所关心的那样持有它,它认为b是一个A对象a.相位;从而产生A追逐而不是B追逐
所以提示:多态性可以与:指针(智能指针或像我在示例中使用的原始指针)或引用一起使用。如果你想使用多态能力,如果你使用了指针/引用,它就会起作用
另一个技巧是使用override来通知编译器你正在重写一个"父"函数,当你有错误的参数等时,它会帮助你(会产生正确的编译器错误等)。
最重要的事情之一是始终使基类中的析构函数为虚拟的,以确保没有僵尸出现
Board
类包含Ghost
对象的数组,而不是Chase
对象。所以G[0].chase(bD);
总是调用Ghost::chase()
,而不是Chase::chase()
。仅仅因为在Chase
中定义了覆盖,并不意味着它在使用Ghost
的任何地方都会自动使用。多态性只有当基类类型的指针/引用指向派生类型的对象时才有效。您的代码没有。要解决此问题,请使数组包含指向Chase
对象的Ghost*
指针。例如:
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);
}
};
- 多态二进制函数
- Doees the 'this' 指针参与虚函数的多态行为
- 如何在基类指针向量的元素上应用重载的多态函数
- 对具有不同参数数量的虚函数的多态调用
- 从基类调用函数的多态性
- 如何在不同类型的值之间进行选择以传递给多态函数?
- 使用具有多态行为的重载函数
- C++多态性:有没有办法找到对象成员函数的地址?
- C++ 多态性:如果派生类中的虚函数在基类中声明了常量,是否需要将其声明为常量
- 尝试从多态函数中获得不同的输出
- 如果基类指针无法访问派生类成员函数,那么多态性有什么方便的呢?
- 多态记录器(虚拟模板化函数?
- 一个类似 std::访问的函数,用于访问多态类型
- 为什么在将多态行为与指向接口的指针一起使用时没有调用析构函数?
- 有没有办法编写多态模板函数
- C++ 中函数指针中的多态参数
- 为什么删除的复制构造函数不允许使用其他具有多态类型的构造函数?
- 具有引用数据类型的函数多态性
- 模板函数多态性
- 基类和派生类构造函数多态性问题