C++中的多态是一个重要的内容,多态分为四类:重载多态,强制多态,包含多态,参数多态!其中重载多态,强制多态这两种又被称为专用多态,而包含多态,参数多态这两种多态被称为通用多态!
多态从实现的角度来说分为两类:编译时的多态和运行时的多态。
这次主要研究了通用多态中的包含多态!
说到包含多态,则虚函数就是不可或缺的主角了,虚函数是动态绑定的基础,什么是绑定呢?确定操作的具体对象的过程就是绑定,按照绑定进行的阶段不同又分为静态绑定(绑定过程出现在编译阶段,用对象名或者类名来限定要调用的函数)和动态绑定(绑定过程工作在程序运行时执行,在程序运行时才确定将要调用的函数)
虚函数必须为非静态的成员函数、PS:我想应该是因为虚函数是实现运行中的多态的吧,即动态绑定,所以应该为非静态成员函数。这里又想到一个知识点,友元函数为非成员函数!!
虚函数【例子 P317 例8-4】
一般虚函数成员声明:
virtual 函数类型 函数名(形参表)
victual 只能出现在虚函数的原型声明中,不得出现在函数实现的时候,虚函数一般不声明为内联函数。具有继承性,基类中声明了虚函数,派生类中无论是否说明,同原型函数都自动为虚函数。
本质:不是重载声明而是覆盖。
调用方式:通过基类指针或引用,执行时会 根据指针指向的对象的类,决定调用哪个函数。
没有虚构造函数,只有虚析构函数!!!!!
虚析构函数【例子 P320 例8-5】
虚析构函数的声明为:
victual ~类名()
如果一个类的析构函数为虚函数,则派生出的子类的析构函数也为虚析构函数。
纯虚函数【例子:P323 例8-6】
是一个在基类中定义为虚函数,但它在该基类中没有定义具体的操作内容,要各派生类根据实际需要给出各自的定义
纯虚函数声明如下:
virtual 类型 函数名(参数表)=0;
PS:纯虚函数和空的虚函数不一样
1,纯虚函数根本没有函数体 空的虚函数的函数体为空
2,纯虚函数所在的类为抽象类,不能实例化 空的虚函数是可以实例化的
相同点:都可以派生出新的类,然后在新类中给出虚函数新的实现(可具有多态特征)
抽象类:带有纯虚函数的类 不能实例化
class 类名
{
virtual 类型 函数名(参数表)=0;
//纯虚函数
...
}
注:
抽象类只能作为基类来使用。
不能声明抽象类的对象。
构造函数不能是虚函数,析构函数可以是虚函数