被覆盖的虚方法仍然调用基类中的函数

Overriden virtual method still calls function in base class

本文关键字:调用 基类 函数 覆盖 方法      更新时间:2023-10-16

我用c++编写了下面这个简单的继承示例。

#include<bits/stdc++.h>
using namespace std;
class Animal{
    public:
    string mName;
    Animal(string pName){
        mName=pName;
    }
    virtual void printAnimal(){
        cout<<"Animal "<<this->mName<<endl;
    }
};
class Dog: public Animal{
    public: 
    Dog(string pName): Animal(pName){}
    void printAnimal(){
        cout<<"Dog "<<this->mName<<endl;
    }
};
class Cat: public Animal{
    public:
    Cat(string pName): Animal(pName){}

    void printAnimal(){
        cout<<"Cat "<<this->mName<<endl;
    }
};
Animal getCat(){
    return Cat("Tom");
}
Animal getDog(){
    return Dog("Scooby");
}
int main(){
    getCat().printAnimal();
    getDog().printAnimal();
}

根据我的理解,如果我们重写基类中给定的虚函数,那么无论引用是基类还是派生类,当调用被重写的函数时,它应该调用派生类中定义的函数,而不是基类。

因此,上面程序的输出应该是:
Cat Tom
Dog Scooby

但是我得到,

Animal Tom
Animal Scooby

为什么会发生这种情况?正确的做法是什么?

您可以传递shared_ptr来代替,以防止对象从对象切片,正如@dude: Demo

所提到的
shared_ptr<Animal> getCat(){
    return make_shared<Cat>("Tom");
}
shared_ptr<Animal> getDog(){
    return make_shared<Dog>("Scooby");
}
int main(){
    getCat()->printAnimal();
    getDog()->printAnimal();
}

Edit:改变指针指向shared_ptr的返回值以防止内存泄漏,正如注释中正确建议的那样。