为什么和何时使用多态来将基类指向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。他们都需要有一个方法,但是他们的实现都是不同的。基类可以保存默认实现,也可以不保存,即使方法是纯虚拟的。