函数是否可以接受抽象基类作为参数

Can functions accept abstract base classes as arguments?

本文关键字:基类 参数 抽象 是否 函数      更新时间:2023-10-16

在熟悉了基本类和封装的概念后,我开始了解多态性,但我不太清楚如何使其发挥作用。我搜索过的许多例子都是强迫的(Foo和Bar类对我来说太抽象了,看不到实用程序),但我是如何理解这个基本概念的:你写一个基类,从中派生出一大堆其他东西,这些东西改变了的基方法的作用(但不是它们的"本质"),然后您可以编写通用函数来接受和处理任何派生类,因为您已经在某种程度上标准化了它们的外观。有了这个前提,我尝试实现基本的动物->猫/狗层次结构,如下所示:

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();
}

speakTo可以带的地方可以带一种普通的动物,让它说话。但据我所知,这不起作用,因为我无法实例化Animal(特别是在函数参数中)。那么,我想问,我是否理解多态性的基本效用,以及我如何才能真正做我试图做的事情?

不能将Animal对象传递给派生类函数,因为不能创建Animal类的对象等等,它是一个抽象类
如果一个类至少包含一个纯虚拟函数(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;
}

您需要传递引用而不是副本:

void speakTo(Animal& animal) {
    animal.speak();
}
相关文章: