多态性概述
一、定义
1、多态:是指同样的消息被不同类型的对象接受时导致完全不同的行为。多态分为编译时的多态和运行时的多态。
2、消息:是指对类的成员函数的调用。
3、编译时的多态:是在编译的过程中确定了同名操作的具体操作对象。
4、运行时的多态:是在程序运行过程中才动态地确定操作所针对的具体对象。
5、联编:确定操作的具体对象的过程,也称为绑定。
6、静态联编:在编译和连接时进行。
7、动态联编:在运行时进行。
二、静态联编与动态联编的对比
静态联编程序执行效率高,执行速度快;动态联编灵活,但执行速度慢。
运算符重载
一、运算符重载
1、定义:使同一个运算符作用于不同类型的数据时导致不同的行为的这种机制。
2、优点:扩展了运算符的功能;比一般的函数调用更简洁、直观、增加程序可读性。
二、不具备重载的运算符
1、成员选择运算符 .
2、成员指针运算符 .*
3、作用域分辨符 ::
4、三目选择运算符 ?:
5、计算数据大小运算符 sizeof
二、运算符的重载规则
1、重载后运算符的优先级与结合性不会改变。
2、不能改变原运算符操作数的个数。
3、不能重载C++中没有的运算符。
4、不能改变运算符的原有语义。
三、重载为类的友元函数
1、定义:将运算符重载为类的友元函数要在类中使用friend关键字来说声明该运算符函数为友元函数。
2、作用:可以自由地访问该类的任何数据成员。
四、重载为类的成员函数
1、定义:将运算符函数重载为类的成员函数。
2、作用:可以自由访问本类的数据成员。
五、重载为类的成员函数的特点
1、双目运算符重载为类的成员函数时,函数只显式说明一个参数,该形参是运算符的右操作数。
2、前置单目运算符重载为类的成员函数时,不需要显式说明参数,即函数没有形参。
3、后置单目运算符重载为类的成员函数时,为了与前置单目运算符区别,函数要带有一个整型形参。
六、重载为类的成员函数与友元函数的对比
1、单目运算符最好重载为类的成员函数;双目运算符则最好重载为类的友元函数。
2、=、()、[]、—> 双目运算符不能重载为类的友元函数。
3、类型转换函数只能定义为一个类的成员函数而不能定义为类的友元函数。
4、一个运算符的操作需要修改对象的状态,选择重载为成员函数比较好。
5、运算符所需的操作数希望有隐式类型装换,只能选友元函数。
6、需要重载运算符的运算具有可交换性时,选择重载为友元函数。
虚函数
一、定义
允许函数调用与函数体之间的联系在运行时才建立,是实现动态联编的基础。
二、特点
1、虚函数有函数体。
2、虚函数在静态联编时当成一般成员函数使用。
3、虚函数可以派生,如果在派生类中没有重新定义虚函数,虚函数就充当了派生类的虚函数。
4、虚函数不是静态成员函数,也不能是友元函数。
5、虚函数在类的内部定义。
6、只有类的成员函数才能说明为虚函数,它的声明只能出现在类的定义中。
7、构造函数不能是虚函数,析构函数可以是虚函数。
抽象类
一、抽象类
抽象类是一个特殊的类,是为了抽象的目的而建立的,通过它多态的使用其中的成员函数,为一个类族提供统一的操作界面。
二、纯虚函数
1、定义:是一个在基类中说明的虚函数。
2、作用:为派生类提供一个一致的接口。
三、空虚函数
一种函数体为空的虚函数。
四、纯虚函数与空虚函数的区别
1、纯虚函数没有函数体;空虚函数函数体为空。
2、纯虚函数所在的类是抽象类,不能直接进行实例化;空虚函数所在的类是可以实例化的。