如何解决C++ 的多态性
我正在尝试实现多态,即根据传递给函数的实例调用派生类的特定方法。
我不确定这是否可能。任何指导都会非常有用。
这是代码:
#include <iostream>
using namespace std;
class Animal
{
public:
void speak()
{
cout << "Base: Animal Speaking!" << endl;
}
};
class Dog : public Animal
{
public:
void speak()
{
cout << "Dog: Woof!" << endl;
}
};
class Cat : public Animal
{
public:
void speak()
{
cout << "Cat: Meow!" << endl;
}
};
class FarmAnimal : public Animal
{
public:
void speak(Animal *animal)
{
animal->speak();
}
};
int main()
{
Dog dog = Dog();
Cat cat = Cat();
FarmAnimal farm_animal = FarmAnimal();
dog.speak();
cat.speak();
farm_animal.speak(&dog);
farm_animal.speak(&cat);
return 0;
}
输出:
Dog: Woof!
Base: Meow!
Base: Animal Speaking!
Base: Animal Speaking!
预期输出:
Dog: Woof!
Base: Meow!
Dog: Woof!
Cat: Meow!
解决方法
当然可以。
我建议将 Animal 设为“抽象”基类。声明函数 virtual
并通过将它们设置为 0 使它们“纯”(强制派生类覆盖它们以便能够被实例化。)
class Animal
{
public:
virtual ~Animal() = default; // allows polymorphic destruction too
virtual void speak() = 0;
};
然后将派生类标记为覆盖基类:
class Dog : public Animal
{
public:
void speak() override
{
cout << "Dog: Woof!" << endl;
}
};
class Cat : public Animal
{
public:
void speak() override
{
cout << "Cat: Meow!" << endl;
}
};
至于FarmAnimal
,我不会为继承发疯。这个类看起来像一个奇怪的模型,因为它作用于其他动物,而不是它自己。过度继承会导致设计复杂。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。