问题覆盖虚函数

Wil*_*iam 3 c++ polymorphism inheritance

好吧,我正在编写一个游戏,其中包含一个pairent类(敌人)的向量,它将被子类(goomba,koopa,boss1)填充,我需要在调用update时调用子类.各自的更新.我设法创建了一个问题的例子.

#include <stdio.h>
class A{
    public:
        virtual void print(){printf("Hello from A");}
};

class B : public A{
    public:
        void print(){printf("Hello from B");}
};


int main(){
    A ab = B();
    ab.print();
    while(true){}
}
Run Code Online (Sandbox Code Playgroud)

输出需要:"你好B"输出得到:"你好A"

如何让它调用B的打印功能?

Tyl*_*nry 14

多态性仅适用于指针和引用.如果分配B到的A,它变成一个A和你失去所有的B特定信息,包括方法覆盖.这称为"切片"; 在B当它被分配给一个父类的一个对象部件被"切分"关闭该对象.

在另一方面,如果你分配B*一个A*,它看起来像一个A*,但仍然是真正的指向B,所以B特定信息仍然存在,并且B的虚拟覆盖将被使用.

尝试:

int main(){
    A* ab = new B();
    ab->print();
    delete ab;
    while(true){}
}
Run Code Online (Sandbox Code Playgroud)

这同样适用于将a指定BA&(reference-to- A),例如

int main(){
    B b;
    A& ab = b;
    ab.print();
    while(true){}
}
Run Code Online (Sandbox Code Playgroud)

  • 你们两个(来自你的帖子历史)似乎都来自Java背景.重要的是要记住,在Java中,所有对象都是引用(在Java意义上,它实际上介于C++指针和C++引用之间),并且一切都是虚拟的,因此多态性始终有效.在C++中,对象是值类型,因此分配两个对象确实会将右侧的值分配给左侧,而不是将左侧作为对右侧相同对象的引用.这意味着切片可能会发生,因为"A"对象根本无法存储"B"的额外信息. (4认同)