c++ - 为什么以及何时使用多态性将基类指向 C++ 中的派生类
问题描述
假设以下代码:
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;
or dri *d = new dri()
,因为它已经包含base
.
解决方案
如果你想要一个dri
,那么就继续声明你的变量。
多态性的好处是,如果您只需要在 上定义的方法base
,那么您可以将变量(或最有可能的函数参数)定义为base *
(or base &
),并且您的代码将适用于从 include 派生的任何base
类dri
。
如果您的系统中只有两个类 (base
和dri
),那么很难看到好处。但是想象一下,基类是更通用的东西DataSource
,它有一个名为readData
. 现在,您可以编写从源读取数据的代码,而不必担心数据源是 aDatabase
或 aKeyboard
或Sensor
其他任何东西。您可以编写数据处理逻辑,其他人可以稍后通过创建新DataSource
子类来添加新源。
为了使它起作用,所涉及的方法必须是virtual
. 如果您定义一个非虚拟base
方法并使用base
指针或引用调用它,您将始终获得该函数,即使子类试图覆盖它。该virtual
关键字告诉 C++ 调用为实际对象类型而不是声明的变量类型定义的方法。
推荐阅读
- webgl - Webgl 2.0 中的 Msaa - 在 Quad 上执行 Msaa
- php - PHP foreach 循环两次插入最后一个元素
- postgresql - 在不锁定的情况下更新 PostgreSQL 中的一个非常大的表
- hyperledger - 恢复单一资产历史
- javascript - 从表格单元格中获取值并显示在 MVC 中的部分视图表格单元格中
- reporting-services - 表中表 | Power BI 报表生成器
- python - Pandas:尝试提取两种不同的模式
- python - 绘制一个图,右侧有一个额外的 y 轴,顶部有一个额外的 x 轴,链接到底部
- initialization - Modelica中如何根据不同场景更新Real变量?
- python - Python 使用两个分隔符“/”和“”分割一行