先放码过来:
#include"iostream"
using namespace std;
class Animal {
public:
virtual void makeSound() {
cout << "make some noice:" << endl;
}
};
class Dog : public Animal{
public:
void makeSound()override {
cout << "汪" << endl;
}
};
class Cat : public Animal {
public:
void makeSound()override {
cout << "喵" << endl;
}
};
void playSound(Animal &animal) {
animal.makeSound();
}
void main() {
Dog D;
Cat C;
playSound(C);
}
playSound函数用到了引用,如果使用值传递的话就会运行基类Animal的makeSound虚函数,而不是对应的子类的makeSound重写函数。
GPT是这么解释的:
在C++中,如果你不用引用(
&
)传递对象,而是用值传递,那么会发生对象的拷贝。这时,即使传递的是子类对象,在函数内部处理的实际上是基类对象的副本。由于这种副本是基类类型,它会调用基类的成员函数,而不是子类的重写函数。这种行为违背了多态性的基本原则。