这个问题已经在这里有一个答案:
假设下面的代码:
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
的所有功能。
如果你想要一个dri
,然后就继续和你声明的变量本身。
多态性的好处是,如果你需要的是被上base
定义的方法,那么你可以定义变量(或最有可能的,功能参数)作为base *
(或base &
)和你的代码将与来自base
派生的任何类工作包括dri
。
如果只有两个在您的系统(base
和dri
)班则很难看到它的好处。但可想而知,基类的东西更普遍喜欢DataSource
,它有一个叫readData
方法。现在,您可以编写代码读取从源数据,而不必担心数据源是Database
或Keyboard
或Sensor
或其他任何东西。你可以写在数据处理逻辑,后来别人可以一起去,并通过创建新DataSource
子类添加新的来源。
为了使这项工作,所涉及的方法必须是virtual
。如果你定义一个非虚base
方法,并用base
指针或引用调用它,您总能获得该功能,即使一个子类试图将其覆盖。所述virtual
关键字告诉C ++调用的实际的对象类型,而不是声明的变量类型定义的方法。