在面向对象方法中这样描述多态性,向不同的对象发送同一个消息,它们接收后会产生不同的行为(即方法)。
在C++ 程序设计中,多态性是指具有不同功能的函数可以使用一个函数名。
1、说明
“多态性”,指同样的消息被不同的对象接收时导致的不同行为。
“消息” 是指对类的成员函数的调用;
“不同的行为” 是指不同的实现,也就是调用了不同的函数。
注:函数的重载、运算符重载都是多态现象。
2、多态性分类
(1)静态多态性, 学过的函数重载和运算符重载属于静态多态性,在编译程序时系统就可以确定调用哪个函数,它又称编译时的多态性。
静态多态性是通过函数重载实现的。
(2)动态多态性,是在程序运行中才能确定操作所针对的对象,它又称运行时的多态性。
动态多态性是通过虚函数实现的。
3、研究的问题
从一个基类派生出不同的派生类时,各派生类可以使用与基类成员相同的成员名,如果在运行时用相同的成员名调用类的成员,会调用哪个类的成员?
即,通过继承而产生了相关的不同的派生类,与基类成员同名的成员在各个派生类中有不同的含义。
多态性是一个接口多种方法。
4、多态性的基础——赋值兼容性规则
(1)含义
在需要基类对象的任何地方都可以使用公有派生类的对象来替代。
(2)实质
公有派生类实际上具备了基类的所有功能,凡是基类能解决的问题,派生类都可以解决。
5、赋值兼容性规则
(1)派生类的对象可以给基类的对象赋值。
例: class derived :public base;
// derived类是base类的公有派生类
derived d;
base b;
b=d;
反之不然,即基类对象不能赋值给派生类的对象,即使使用强制类型转换也不行。
例:d=b; //error
d= (derived) b; //error
原因:基类对象不具有派生类的所有成员.
(2)派生类的对象可以初始化基类引用。
例: class derived :public base;
derived d;
base &rb=d;
反之不然,除非通过强制类型转换,用一个基类的对象初始化其派生类的对象。
例:base b; //正确
derived &rd=(derived) b; //正确
(3)派生类的对象的地址可以赋给指向基类的指针。
例:class derived :public base;
derived d ; base *pb=&d;
反之不然,除非通过强制类型转换,把一个指向基类的指针赋值给一个指向其派生类的指针。例:base *pb=new base;
derived *pd=(derived *)pb;
6、赋值兼容性规则的作用
赋值兼容性规则的引入,对于基类及其公有派生类的对象,就可以使用相同的函数统一处理,而没有必要为每个类设计单独的功能模块。
(1)当函数的形参为基类对象时,实参可以是派生类的对象。
(2)当函数的形参为指向基类对象的指针时,实参可以是派生类对象的地址。
(3)当函数的形参为基类对象的引用时,实参可以是派生类的对象。

