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

C++ 函数可以接受抽象基类作为参数吗?,c++,inheritance,polymorphism,abstract-class,C++,Inheritance,Polymorphism,Abstract Class,在熟悉了基本类和封装的概念之后,我开始了解多态性,但我不太清楚如何使其工作。我搜索过的许多示例都是非常非常被迫的(Foo和Bar类对我来说太抽象了,看不到实用程序),但下面是我理解基本概念的方式:编写一个基类,从中派生出一大堆其他东西,这些东西改变了基方法的功能(但不是它们“是什么”),然后您可以编写通用函数来接受和处理任何派生类,因为您已经在某种程度上标准化了它们的外观。在这个前提下,我尝试实现基本的动物->猫/狗层次结构,如下所示: class Animal { public:

在熟悉了基本类和封装的概念之后,我开始了解多态性,但我不太清楚如何使其工作。我搜索过的许多示例都是非常非常被迫的(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();
}
类动物{
公众:
虚拟void speak()=0;
};
犬类:公共动物{
公众:

void speak(){cout您无法将
动物
对象传递给派生类函数,因为您无法创建
动物
类等的对象,它是一个抽象类
如果一个类至少包含一个纯虚函数(
speak()
),那么该类将成为一个抽象类,您无法创建它的任何对象。但是,您可以创建指针或引用并将它们传递给它。 您可以向方法传递
动物
指针或引用

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

啊,太棒了!我读过“指向派生类的指针与指向其基类的指针类型兼容”,但我在“按引用传递”与“实际传递指针”中挂断了。传递指针与PBR有什么不同吗,或者PBR的符号只是通知编译器特别处理语法(如果有意义的话…)?@connorG:Reference不会接受null,否则它们几乎就是空的same@ConnorG:好的,没有人能比年的Scott Meyers更好地回答你的问题。请注意,为了简单起见,我在示例中使用了指针。