一 多态性
1 多态性分类:
(1)编译时的多态性:由静态联编支持,以函数重载为基础;重载函数的实现策略为静态联编。
(2)运行时的多态性:由动态联编支持,以虚函数为基础;虚函数的实现策略为动态联编
注意:虚函数类似于重载函数,但与重载函数的实现策略不同,对虚函数使用动态联编。
2 静态联编中的赋值兼容性及名字支配规律
(1)赋值兼容规则是指在需要基类对象的任何地方都可以使用公有派生类的对象来替代。
(2)派生类中的同名成员覆盖基类的同名成员。
3 动态联编的多态性
二 虚函数
1 定义
void 类名 ::fun(){.....//}
2 实现多态性的条件
(1)类之间的继承关系满足赋值兼容性规则
(2)改写了同名虚函数
(3)根据赋值兼容性规则使用指针(或引用)
1)按赋值兼容性规则使用基类指针或引用访问虚函数
2)把指针或引用作为函数参数,即这个函数不一定是类的成员函数,可以是普通函数,可以重载。
3 纯虚函数与抽象类
(1)纯虚函数
1)说明: class 类名{
virtual 函数类型 函数名(参数列表)=0;
};
2)特点:
一个类可以说明多个纯虚函数
成员函数可以调用纯虚函数,构造函数和析构函数不可以,否则会导致程序运行错误。
(2)抽象类:
包含有纯虚函数的类称为抽象类
1)注意:
一个抽象类不能实例化对象,但是可以说明指向抽象类对象的指针或引用 例如Point *p;
从一个抽象类派生的类必须提供纯虚函数的实现代码,或在该派生类中仍将它说明为纯虚函数。否则编译器会给出错误信息。
抽象类的派生类仍是抽象类,如果该派生类给出了基类所有纯虚函数的实现,则该派生类不再是抽象类。
抽象类至少含有一个虚函数,而且至少有一个虚函数是纯虚函数,便于与空的虚函数区分开来。
virtual void fun()=0; //纯虚函数
virtual void fun(){}; //空的虚函数
4 注意
(1)一旦基类定义了虚函数,该基类的派生类中的同名函数也自动成为虚函数
(2)虚函数只能是类中的一个成员函数,但不能是静态成员。
(3)派生类中定义一个与基类同名的成员函数,只要改成员函数的参数个数和相应的类型以及返回类型与基类中同名的虚函数完全一样,无论是否为该成员函数使用virtual,该成员函数都是虚函数。
总结:
编译时的多态性实现方式为函数重载,运行时的多态性实现方式为虚函数。函数重载采用的策略是静态联编,虚函数采用的策略是动态联编。