Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么和何时使用多态来将基类指向C++中的派生类_C++_Inheritance_Polymorphism - Fatal编程技术网

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

为什么和何时使用多态来将基类指向C++中的派生类,c++,inheritance,polymorphism,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; } 我知道有了多态性的魔力,

假设以下代码:

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=新的dri,因为它已经包含了base的所有功能。

如果您想要dri,那么就直接声明您的变量

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

如果您的系统库和dri中只有两个类,那么很难看到它们的好处。但是,假设基类是像DataSource这样更一般的类,并且它有一个名为readData的方法。现在,您可以编写从源读取数据的代码,而不必担心数据源是数据库、键盘、传感器或其他任何东西。您可以编写数据处理逻辑,其他人可以稍后通过创建新的数据源子类来添加新的数据源


为了使这项工作,所涉及的方法必须是虚拟的。如果您定义了一个非虚基方法,并用基指针或引用调用它,那么即使子类试图重写它,您也总能得到该函数。虚拟关键字告诉C++调用为实际对象类型定义的方法,而不是声明的变量类型。

可以生成基*的向量,并将基和DRI实例存储在其中。例如,如果你正在制作一个游戏,你可以将所有敌方类从一个基派生出来,并将它们存储在一个向量中。多态性是一种重用代码的方法。假设您有一个数据消费者,它从文本文件逗号分隔值CSV解析器中获取数据。稍后,您将有一个SQLite后端,因此将不同的SQL解析器传递给数据使用者。数据使用者代码根本不需要更改,即使它是在只有CSV解析器的时候创建的。困难的部分是知道什么时候抽象出一个接口,什么时候不过度设计一个解决方案。基类可以是vehicle,派生类可以是car、truck或motorcycle。他们都需要有一个方法,但是他们的实现都是不同的。基类可以保存默认实现,也可以不保存,即使方法是纯虚拟的。