为啥以及何时使用多态性将基类指向 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 * 的向量,并在其中存储basedri 实例。例如。如果您正在制作游戏,您可以让所有敌人类都派生自一个基础,并将它们全部存储在一个 vector 中。 多态是重用代码的一种方式。假设您有一个数据使用者,它从文本文件逗号分隔值 (CSV) 解析器中获取数据。稍后,您将拥有一个 SQLite 后端,因此您将不同的 SQL 解析器传递给数据使用者。数据消费者代码根本不需要更改,即使它是在只有 CSV 解析器的那一天创建的。困难的部分是知道何时抽象出接口,何时不过度设计解决方案。 想想任何一个例子,你有几个从基类派生的类。您的基类可以是“车辆”,而您的派生类可以是“汽车”、“卡车”或“摩托车”。他们都需要有一个方法“startupRoutine()”,但他们的实现都会有所不同。您的基类可以包含“默认”实现,或者即使该方法是纯虚拟的也可能不包含。 【参考方案1】:

如果您想要dri,那么请继续声明您的变量。

多态性的好处是,如果您只需要在base 上定义的方法,那么您可以将变量(或最有可能的函数参数)定义为base *(或base &amp;)和您的代码将适用于从base 派生的任何类,包括dri

如果您的系统中只有两个类(basedri),那么很难看到好处。但是想象一下,基类是像DataSource 这样更通用的东西,它有一个名为readData 的方法。现在您可以编写从源读取数据的代码,而不必担心数据源是DatabaseKeyboardSensor 或其他任何东西。您可以编写数据处理逻辑,其他人可以稍后通过创建新的DataSource 子类来添加新的源。

为了使它起作用,所涉及的方法必须是virtual。如果您定义一个非虚拟的base 方法并使用base 指针或引用调用它,您将始终获得该函数,即使子类试图覆盖它。 virtual 关键字告诉 C++ 调用为实际对象类型而不是声明的变量类型定义的方法。

【讨论】:

以上是关于为啥以及何时使用多态性将基类指向 C++ 中的派生类 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

为啥当我有两个函数时编译器没有显示错误,一个将基类作为参数,一个将派生类作为参数?

检测基类对指向派生类的引用的分配

C++多态总结

C++多态总结

C++学习_多态

关于C++基类、派生类的引用和指针