Overriden虚方法仍调用基类

时间:2016-11-02 13:15:33

标签: c++ inheritance

我在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

为什么会这样?这样做的正确方法是什么?

1 个答案:

答案 0 :(得分:2)

您可以改为传递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();
}

编辑:更改了从指针到shared_ptr的返回值,以防止内存泄漏,正如评论中正确建议的那样。