虚拟方法没有被覆盖?

时间:2015-11-06 06:18:59

标签: c++

为什么要调用哺乳动物speak方法?

int main() {
    Mammal mammal = Cat("CatName", Blue, 9);
    mammal.speak();
}

class Mammal : public Animal{
public:
    virtual void speak() const {
        cout << "Mammal speaks" << endl;
    }
};

class Cat : public Mammal {
public:
    void speak() const {
        cout << "Cat meow!" << endl;
    }
};

2 个答案:

答案 0 :(得分:2)

多态性仅适用于指针或引用:您声明mammal实际上Mammal的实例。

将其更改为指针或引用会更改语义,因为指针或引用引用了 Mammal的内容。

Mammal const & mammal = Cat();
// or
Mammal * mammal = new Cat();
// don't forget the delete, better:
std::unique_ptr<Mammal> mammal = std::make_unique<Cat>();

在这种情况下,您可能很快就会知道object slicing

答案 1 :(得分:1)

大多数Java和C#程序员面对c ++就是这种情况。您需要动态创建一个对象以及一个虚拟关键字。

因此,创建对象的正确方法应该是

int main
{
  Mammal *mammal = new Cat("CatName", Blue, 9);
  mammal->speak();
}