我试图覆盖父类 Animal speak 函数中的方法,但它不起作用。在 java 中编写了完全相似的代码,它打印出正确的消息,但在 C++ 中却没有。我是否必须在 C++ 中做一些不同的事情才能完成这项工作?
class Animal{
public:
virtual void Speak(){
cout<<"Animal Speak"<<endl;
}
};
class Cat:public Animal{
void Speak() override {
cout<<"Cat speak"<<endl;
}
};
class Dog:public Animal{
void Speak() override {
cout<<"Dog speak"<<endl;
}
};
int main() {
Cat cat;
Dog dog;
Animal ani[]={cat,dog};
ani[0].Speak();
return 0;
}
我期待“Cat Speak”在控制台中打印输出,但它正在打印“Animal Speak”。
最佳答案
Animal ani[]={cat,dog};
行中,cat
和dog
按值复制到2动物
对象。 Object slicing复制过程中发生。所以,ani[0].Speak()
实际上使用了 Animal
类型的对象,而不是 Cat
或 Dog
.
成员函数调用也不是虚拟的,因为该对象是按值使用的。虚拟调用仅通过指针或引用执行。
Animal* dog_as_animal = &dog;
dog_as_animal->Speak();
Animal& cat_as_animal = cat;
cat_as_animal.Speak();
关于c++ - 父类上的方法没有被覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47465342/