被覆盖的虚方法仍然调用基类中的函数
Overriden virtual method still calls function in base class
我用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的返回值以防止内存泄漏,正如注释中正确建议的那样。
相关文章:
- 使用基类指针调用基类的值构造函数的语法是什么?
- 在初始化列表之外手动调用基类的构造函数
- 继承:调用基类的成员和方法
- 在成员构造函数之后调用基类构造函数
- C++初始化之前派生类调用基类的方法
- 如何在具有相同函数名称的派生类中调用基类的函数
- 有没有办法在C++中调用基类的所有子类函数?
- C++:在派生类成员上调用基类方法
- 添加字符串类型的类成员会导致调用基类函数而不是子函数
- 有没有办法调用基类函数,该函数在使用私有继承的派生类中被覆盖?
- 如何在C++中调用基类虚函数
- 如何让派生类在调用基类之前执行操作?
- 在调用基类之前需要在成员上调用方法
- 调用基类克隆实现
- 在派生类中调用基类方法,而无需指定基类名称
- 从参数包中派生的调用基类运算符 =
- 当应该调用派生类方法时,为什么要调用基类方法
- 调用基类函数时强制使用类名?
- 无法从派生的一个方法调用基类方法
- 当派生类无法轻易将参数传递到基类时,如何调用基类构造函数