对基本类和封装的想法感到满意之后,我已经开始了解多态性,但我无法弄清楚如何使其工作。我搜索过的很多例子都是真的,真的强迫(类Foo和Bar对我来说太抽象了,看不到实用程序),但这就是我理解基本概念的方法:你编写一个基类,从中导出一大堆其他东西,改变基本方法做什么(但不是它们“是什么”),然后你可以编写通用函数来接受和处理任何一个派生类,因为你有点标准化它们的外观。在这个前提下,我试图实现基本的Animal-> cat / dog层次结构,如下所示:
class Animal {
public:
virtual void speak() = 0;
};
class Dog : public Animal {
public:
void speak() {cout << "Bark bark!" << endl;}
};
class Cat : public Animal {
public:
void speak() {cout << "Meow!" << endl;}
};
void speakTo(Animal animal) {
animal.speak();
}
说话,你可以采取一般的动物,并做,好吧,说话。但据我所知,这不起作用,因为我无法实例化Animal(特别是在函数参数中)。我问,那么,我是否理解多态的基本效用,我怎样真的做我试过的事情?
答案 0 :(得分:20)
您无法将Animal
对象传递给派生类函数,因为您无法创建Animal
class et all的对象,它是抽象类。
如果一个类包含至少一个纯虚函数(speak()
),那么该类将成为一个抽象类,您无法创建它的任何对象。但是,您可以创建指针或引用并将它们传递给它。
您可以传递Animal
指针或对方法的引用。
void speakTo(Animal* animal)
{
animal->speak();
}
int main()
{
Animal *ptr = new Dog();
speakTo(ptr);
delete ptr; //Don't Forget to do this whenever you use new()
return 0;
}
答案 1 :(得分:11)
您需要传递引用而不是副本:
void speakTo(Animal& animal) {
animal.speak();
}