c++ - 父类上的方法没有被覆盖

标签 c++

我试图覆盖父类 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};行中,catdog按值复制到2动物对象。 Object slicing复制过程中发生。所以,ani[0].Speak() 实际上使用了 Animal 类型的对象,而不是 CatDog .

成员函数调用也不是虚拟的,因为该对象是按值使用的。虚拟调用仅通过指针或引用执行。

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/

相关文章:

c++ - 如何管理大型阵列

c++ - const 访问和非常量访问

c++ - 如何安装 OpenCV 3.3.1。跟踪 API (Ubuntu 16.04)

c++ - 运算符 x++;和++x;对于 int。哪个更快?为什么?

c++ - 使用 istringstream 将 std::string 标记化为 std::map

c++ - 无法访问模板化重载运算符中的私有(private)成员

c++ - 检查 boost 属性树中的值是树还是终端值

c++ - 以下场景如何使用前向声明

c++ - 如何将 C/C++ 库集成到 Objective-C 中

c++ - 如何复制cin