2015-11-06 87 views
0

为什么哺乳动物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; 
    } 
}; 
+1

不应该是''哺乳动物*哺乳动物=新猫();' –

+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

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

所以,要创建一个对象的正确方法应该是

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