假设以下代码:
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
的所有功能。
答案 0 :(得分:1)
如果您想要dri
,则只需继续声明变量即可。
多态性的好处是,如果您只需要在base
上定义的方法,则可以将变量(或最有可能的函数参数)定义为base *
(或{{ 1}}),您的代码将适用于从base &
派生的任何类,包括base
。
如果系统中只有两个类(dri
和base
),那么很难看到好处。但可以想象一下,基类更通用,例如dri
,它有一个称为DataSource
的方法。现在,您可以编写从源读取数据的代码,而不必担心数据源是readData
或Database
或Keyboard
或其他任何数据。您可以编写数据处理逻辑,以后其他人可以通过创建新的Sensor
子类来添加新的源。
要使其正常工作,所涉及的方法必须为DataSource
。如果您定义了一个非虚拟的virtual
方法并使用base
指针或引用来调用它,那么即使子类试图覆盖它,也将始终获得该函数。 base
关键字告诉C ++调用为实际对象类型而不是声明的变量类型定义的方法。