为什么要调用哺乳动物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;
}
};
答案 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();
}