我试图覆盖父类动物说话功能中的方法,但它无法正常工作。在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;
}
我期待&#34; Cat Speak&#34;要在控制台中打印输出,但它正在打印&#34; Animal Speak&#34;。
答案 0 :(得分:3)
在第Animal ani[]={cat,dog};
行中,cat
和dog
按值复制到2个Animal
个对象中。复制期间发生Object slicing。因此,ani[0].Speak()
实际上使用了Animal
类型的对象,而不是Cat
或Dog
。
成员函数调用也不是虚拟的,因为该对象由value使用。虚拟调用仅通过指针或引用执行。
Animal* dog_as_animal = &dog;
dog_as_animal->Speak();
Animal& cat_as_animal = cat;
cat_as_animal.Speak();
答案 1 :(得分:2)
将猫对象复制到动物对象。与狗同上。
您可以通过实施复制构造函数来验证这一点。
我认为你需要:
Animal* ani[]={&cat,&dog};
ani[0]->Speak();