如果有几个以上相似而不完全相同的对象,有时人们要求在向他们发出同一个消息时,他们的反应各不相同,分别执行不同的操作。这种情况就是多态的现象。
例如,甲乙丙三个班都是一年级,他们有基本相同的属性和行为,在同事听到上课铃声的时候,他们会分别走向三个不同的教室,而不会走向同一个教室
又如在windows环境下没你用鼠标双击一个对象,如果对象是一个可执行文件,那么就会执行此程序,如果对象是一个文本文档,则会启动文本编辑器来打开该文件
C++中所谓的多态(polymorphis)是指,有继承而产生的相关的 不同的类,其对象对同一个消息会做出不同的响应。
多态性是面向对象程序设计的一个重要特征,能增加程序的灵活性。还可以减轻以后维护,升级,调试的工作量和复杂度。
关于多态的实现那就是涉及到了 “赋值兼容”,这是多态实现的前提。
规则:
赋值兼容规则是指在需要基类对象的任何地方都可以使用公用派生类对对象来替代。赋值兼容是一种默认行为,不需要任何的显示的转化步骤。
赋值兼容规则中包括以下情况:
1.派生类的对象可以赋值给基类对象。
2.派生类的对象可以初始化基类的引用。
3.派生类对象的地址可以赋给指向基类的指针。
(在替代之后,派生类对象就可以作为基类的对象使用,但是只能使用从基类继承的成员)
代码如下:
#include <iostream> using namespace std; class Shape { public: Shape(int x, int y) :_x(x),_y(y){} void draw() { cout<<"draw Shape "; cout<<"start ("<<_x<<" , "<<_y<<") "<<endl; } protected: int _x; int _y; }; class Circle: public Shape { public: Circle(int _x,int _y, int r) :Shape(_x,_y),_r(r){} void draw() { cout<<"draw Circle "; cout<<"start ("<<_x<<" , "<<_y<<") "<<"radio r = "<<_r<<endl; } private: int _r; }; int main(int argc, char const *argv[]) { Shape s(3,5); s.draw(); Circle c(1,3,5); c.draw(); s = c; s.draw(); Shape &rs = c; rs.draw(); Shape *ps = &c; ps->draw(); return 0; }
运行结果: