函数可以接受抽象基类作为参数吗?

Con*_*ser 20 c++ polymorphism inheritance abstract-class

我已经对基本类和封装的想法感到满意,我已经开始着手理解多态,但我无法弄清楚如何使其工作.我搜索过的很多例子都是真的,非常强迫(类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();
}
Run Code Online (Sandbox Code Playgroud)

在哪里说话可以采取一般种类的动物,并使它,好吧,说话.但据我所知,这不起作用,因为我无法实例化Animal(特别是在函数参数中).我问,那么,我是否理解多态性的基本效用,我怎样才能真正做到我试图做的事情?

Alo*_*ave 21

您不能将Animal对象传递给派生类函数,因为您无法创建Animal类et all 的对象,它是一个Abstract类.
如果一个类包含至少一个纯虚函数(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;
}
Run Code Online (Sandbox Code Playgroud)

  • 啊,太好了!我读过“指向派生类的指针与指向其基类的指针在类型上兼容”,但是我迷上了传递引用与实际传递指针的关系。传递指针是否与PBR完全不同,还是PBR的“&”号只是通知编译器特别对待语法(如果这样做有意义的话...)? (2认同)

Vau*_*ato 12

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

void speakTo(Animal& animal) {
    animal.speak();
}
Run Code Online (Sandbox Code Playgroud)