我在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
为什么会这样?这样做的正确方法是什么?
答案 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的返回值,以防止内存泄漏,正如评论中正确建议的那样。