为什么和何时使用多态性将基类指向C ++中的派生类

时间:2019-02-03 14:31:17

标签: c++ inheritance polymorphism

假设以下代码:

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的所有功能。

1 个答案:

答案 0 :(得分:1)

如果您想要dri,则只需继续声明变量即可。

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

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

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