函数是否可以接受抽象基类作为参数
Can functions accept abstract base classes as arguments?
在熟悉了基本类和封装的概念后,我开始了解多态性,但我不太清楚如何使其发挥作用。我搜索过的许多例子都是强迫的(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();
}
相关文章:
- 如何使基类的运算符对基类的可变参数数可见(请参阅下面的代码)?
- 命名参数习惯用法和(抽象)基类
- C++重载函数,一个采用基类的参数,另一个采用派生类的参数
- 如何允许模板参数中的类类型,仅当它有两个基类时
- 为什么我需要在成员发起器列表中重复基类的模板参数?
- 如何在不使用指针的情况下将派生类的对象作为参数传递给基类中的函数?
- C++17 使用驱动类常量作为基类构造函数的参数来初始化基类构造函数
- 根据参数数调用 mixin 基类的构造函数
- 派生类(构造函数具有参数)和基类(构造函数缺少参数)之间没有可行的转换
- 如何将子类作为函数的参数传递给期望基类,然后将该对象传递到指向这些抽象类对象的指针向量中?
- 在C++单元测试上下文中,抽象基类是否应将其他抽象基类作为函数参数
- C++ 如何使派生类自动获取基类参数
- 将派生类作为参数传递给方法,该方法是具有智能指针的基类
- 将函数上调整到基类参数的另一个
- 将派生类对象传递给具有 C++ 中基类参数的函数时,为什么要传递引用而不是值?
- 如何使用派生类中的虚拟函数,该函数在另一个具有基类参数的类中声明
- 将基类 2 参数构造函数调用到子类 1 参数构造函数中
- 指向友元函数中基类参数类型的指针
- 按值传递共享指针并接受作为基类参数是如何工作的
- 为带有基类参数的派生类参数调用函数重载