多态性是面向对象的程序设计的关键技术。调用同一个函数名,可以根据需要但实现不同的功能,这便是多态。多态性分为编译时的多态(函数重载)跟运行时的多态(虚函数)。
运行时的多态是指在程序执行之前,根据函数名和参数无法确定应该调用哪一个函数,必须在程序的执行过程中根据具体的执行情况来动态地确定。可以将一个派生类对象的地址赋值给基类的指针变量。
class Point{ float x,y; public: Point(){} Point(float i,float j){ x=i; y=j; } float area(void) { return 0.0; } }; const float Pi=3.14159; class Circle:public Point{ //类Point的派生类 float radius; public: Circle(float r){ radius=r; } float area(void) { return Pi*radius*radius; } }; void main(void) { Point *pp; //基类指针,可以将派生类对象的地址赋给基类指针 Circle c(5.4321); pp=&c; cout << pp->area() << endl; //调用的是基类中有的公有函数 }
在这种情况下,使用基类的指针时,只能访问从相应基类中继承来的成员,而不允许访问在派生类中增加的成员。输出为 0。
若要访问派生类中相同名字的函数,必须将基类中的同名函数定义为虚函数,这样,将不同的派生类对象的地址赋给基类的指针变量后,就可以动态地根据这种赋值语句调用不同类中的函数。
class Point{ float x,y; public: Point(){} Point(float i,float j){ x=i; y=j; } virtual float area(void) { return 0.0; } //声明为虚函数 }; const float Pi=3.14159; class Circle:public Point{ //类Point的派生类 float radius; public: Circle(float r){ radius=r; } //虚函数再定义 float area(void) { return Pi*radius*radius;} }; void main(void) { Point *pp; //基类指针,可以将派生类对象的地址赋给基类指针 Circle c(5.4321); pp=&c; cout << pp->area() << endl; //调用虚函数 }
将area()声明为虚函数,编译器对其进行动态聚束,按照实际对象c调用了Circle中的函数area()。使Point类中的area()与Circle类中的area()有一个统一的接口。输出:92.7011。
除非注明,文章均为CppLive 编程在线原创,转载请注明出处,谢谢。