面向对象的多态性分为4类:
- 重载多态
函数重载
运算符重载 - 包含多态(类族中定义于不同类中的同名函数的多态行为)——主要是采用虚函数实现
- 参数多态:与类模板相关联,在使用时必须赋予实际的类型才可以实例化
- 强制多态:是指将一个变量的类型加以变化,以符合函数或操作的要求。如浮点数和整数相加时会将整数变为浮点数再相加。
多态从实现的角度来讲可以划分为两类:
绑定:确定操作所针对的具体对象
- 编译时的多态(在编译阶段完成绑定——静态绑定)
- 运行时的多态(在运行阶段完成绑定——动态绑定)
虚函数是动态绑定的基础,虚函数必须是非静态的成员函数 。
虚函数
虚函数的声明必须只能在类定义中的函数原型声明中,不能再实现时声明为虚函数。如:virtual void display() const;
派生类覆盖基类的成员函数时,既可以使用virtual关键字,也可以不使用。
若派生类没有给出显式的虚函数声明,会根据以下规则判断派生类的函数是否是虚函数:
- 函数名称是否相同
- 参数个数及参数类型是否相同
- 返回值是否相同
Note:
1、构造函数不能是虚函数,但是析构函数可以是虚函数。
2、只有通过基类的指针或引用调用虚函数时,才会发生动态绑定。因为基类的指针可以指向派生类的对象,基类的引用可以作为派生类对象的别名,但是基类的对象却不能表示派生类的对象。(赋值兼容原则)
赋值兼容原则:
- 派生类的对象可以赋值给基类对象
- 派生类的对象可以初始化基类的引用
- 派生类对象的地址可以赋给指向基类的指针。也就是说,指向基类对象的指针变量也可以指向派生类对象。