父类的方法不会覆盖

时间:2017-11-24 01:55:42

标签: c++

我试图覆盖父类动物说话功能中的方法,但它无法正常工作。在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;。

2 个答案:

答案 0 :(得分:3)

在第Animal ani[]={cat,dog};行中,catdog按值复制到2个Animal个对象中。复制期间发生Object slicing。因此,ani[0].Speak()实际上使用了Animal类型的对象,而不是CatDog

成员函数调用也不是虚拟的,因为该对象由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();