我调用的函数不是通过多态访问子类的函数

Function i'm calling is not accessing child class's function through Polymorphism

本文关键字:函数 多态 访问 子类 调用      更新时间:2023-10-16

我正在制作一款吃豆人游戏,我有几个类,包括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&lt-我们给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); 
    }
};