为啥以及何时使用多态性将基类指向 C++ 中的派生类 [重复]
Posted
技术标签:
【中文标题】为啥以及何时使用多态性将基类指向 C++ 中的派生类 [重复]【英文标题】:Why and When is polymorphism used to point a base class to a derived class in C++ [duplicate]为什么以及何时使用多态性将基类指向 C++ 中的派生类 [重复] 【发布时间】:2019-02-03 14:31:16 【问题描述】:假设以下代码:
class base
public:
int getAge()
return 20;
;
class dri : public base
public:
int getAge()
return 30;
;
int main()
base *b = new dri();
std::cout << b->getAge() << std::endl;
return 0;
我知道上面的代码通过多态性的魔力被编译,你会在你的控制台中得到20
,你也可以使用virtual
关键字覆盖它们。
我的问题是,您为什么以及何时使用它?如果您需要dri
类型的对象,为什么不直接使用dri d;
或dri *d = new dri()
,因为它已经包含base
的所有功能。
【问题讨论】:
您可以创建一个base *
的向量,并在其中存储base
和dri
实例。例如。如果您正在制作游戏,您可以让所有敌人类都派生自一个基础,并将它们全部存储在一个 vector
中。
多态是重用代码的一种方式。假设您有一个数据使用者,它从文本文件逗号分隔值 (CSV) 解析器中获取数据。稍后,您将拥有一个 SQLite 后端,因此您将不同的 SQL 解析器传递给数据使用者。数据消费者代码根本不需要更改,即使它是在只有 CSV 解析器的那一天创建的。困难的部分是知道何时抽象出接口,何时不过度设计解决方案。
想想任何一个例子,你有几个从基类派生的类。您的基类可以是“车辆”,而您的派生类可以是“汽车”、“卡车”或“摩托车”。他们都需要有一个方法“startupRoutine()”,但他们的实现都会有所不同。您的基类可以包含“默认”实现,或者即使该方法是纯虚拟的也可能不包含。
【参考方案1】:
如果您想要dri
,那么请继续声明您的变量。
多态性的好处是,如果您只需要在base
上定义的方法,那么您可以将变量(或最有可能的函数参数)定义为base *
(或base &
)和您的代码将适用于从base
派生的任何类,包括dri
。
如果您的系统中只有两个类(base
和dri
),那么很难看到好处。但是想象一下,基类是像DataSource
这样更通用的东西,它有一个名为readData
的方法。现在您可以编写从源读取数据的代码,而不必担心数据源是Database
或Keyboard
或Sensor
或其他任何东西。您可以编写数据处理逻辑,其他人可以稍后通过创建新的DataSource
子类来添加新的源。
为了使它起作用,所涉及的方法必须是virtual
。如果您定义一个非虚拟的base
方法并使用base
指针或引用调用它,您将始终获得该函数,即使子类试图覆盖它。 virtual
关键字告诉 C++ 调用为实际对象类型而不是声明的变量类型定义的方法。
【讨论】:
以上是关于为啥以及何时使用多态性将基类指向 C++ 中的派生类 [重复]的主要内容,如果未能解决你的问题,请参考以下文章