概述:多态是指同样的消息,被不同的类型的对象接收时导致不同的行为。
例如:不同类型的变量同样适用“+”加号运算符时,会依据变量的类型采用不同的方式进行相加
**多态的4种类型:**
专用多态:重载多态、强制多态
通用多态:包含多态、参数多态
重载多态:普通函数及类的成员函数的重载
强制多态:指讲一个变元的类型加以变化,以符合一个函数或者操作的要求。
包含多态:是类族中定义于不同类中的同名函数的多态行为,主要通过虚函数来实现。
参数多态:与类模板相关联,在使用时必须赋予实际的类型才可以实例化。
**多态的两类实现:**
编译时的多态:在编译过程中确定了多操作的具体操作对象。
运行时的多态:在程序运行过程中才动态地确定操作所针对的具体对象。
这种确定操作的具体对象的过程就是绑定。
绑定:只计算机程序自身彼此关联的过程,即把一个标识符名和一个存储地址联系在一起的过程;就是把一条消息和一个对象的方法相结合的过程。
按进行的阶段分的两种不同的绑定方法:
静态绑定:绑定工作在编译连接阶段完成。
动态绑定:绑定工作在程序运行阶段完成 - 包含多态。
运算符重载:对已有的运算符赋予多重含义,使同一个运算符作用于不同的类型数据时导致不同的行为。
重载为非成员函数:必须把操作数全部通过形参的方式传递给运算符重载函数。
重载为非静态成员函数:可以自由地访问奔雷的数据成员。实际使用时是指通过该类的某个对象来访问重载的运算符。
虚函数:
1·虚函数是动态绑定的基础。
2·必须是非静态的成员函数。
3·经过派生类后,就可以在类族中实现运行过程中的多态。
一般虚函数成员形式:Virtual 函数类型 函数名(形参表)
虚函数声明只能出现在类定义中的函数原型声明中,而不能在成员函数实现的时像。
运行过程中的多态要满足3个条件:
1·类之间满足赋值兼容规则。
2·要声明虚函数
3·要由成员函数来调用或者通过指针、引用来访问虚函数。
如果是使用对象名来访问虚函数,则可以静态绑定。
只有通过基类的指针或引用调用虚函数,才会发生动态绑定。
虚析构函数:(没有虚析构函数) virtual ~类名();
如果一个类的析构函数是虚函数,那么由它派生的所有自雷的析构函数也是虚函数;这样在使用指针引用时可以动态绑定,实现运行时的多态,保证使用积累类型的指针就能够调用适当的析构函数针对不同的对象进行清理工作。
纯虚函数与抽象类:
抽象类自身无法实例化,只能通过继承机制,生成抽象类的额非抽象派生类,再实例化。
抽象类是带纯虚函数的类。
纯虚函数:virtual 函数类型 函数名(参数表)=0;
基类中可以不给出纯虚函数的实现部分。
抽象类的主要作用是通过它作为一个类族建立一个公共的接口,使他们能够更加有效地发挥多态特性。
深度探索:
C++的两类类类型:
多态类型:泛指有虚函数的类类型。
非多态类型:指所有的其他类型。
两者具有不一样的语言特性;设计过程中的远不能则和理念有所不同。
基类的指针可以指向派生类的对象:
1·若该基类是多态类型,那马通过该指针调用基类的虚函数时实际执行的操作是由派生类决定的。
2·若该基类是非多态类型,那么通过该指针所做的操作,只能是基类本身的操作。
虚函数动态绑定实现原理:
通过指针、引用来调用一个虚函数,实际被调用的虚函数到运行时才能确定。