首页 > 解决方案 > 为什么以及何时使用多态性将基类指向 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.

标签: c++inheritancepolymorphism

解决方案


如果你想要一个dri,那么就继续声明你的变量。

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

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

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


推荐阅读