多态:向不同的对象发送同一个消息,不同的对象在接收时会产生不同的行为(即方法)。(消息,就是指调用函数)
多态性分为两类:静态多态和动态多态。
静态多态是通过函数的重载实现的,动态多态的特点是:不在编译时确定运行那个程序,而是在程序运行的过程中才确定操作所针对的对象。(运行时多态,是通过虚函数实现的)
即如果通过对象名调用虚函数,属于静态关联。如果通过基类指针调用虚函数,为动态关联。
虚函数:
就是在基类声明函数是虚拟的,并不是实际存在的函数,然后在派生类中才正式定义的函数。
虚函数的作用:
允许在派生类中重新定义与基类同名的函数,并且可以通过基类指针或引用来访问基类和派生类中的同名函数。
虚函数的声明方法:
virtual 函数类型 函数名();
虚函数的使用方法:
1、在类外定义虚函数时,不必再加virtual。
2、在派生类中重新定义此函数,函数名,函数类型,函数参数个数和类型必须与基类的虚函数相同。
3、当一个成员函数被声明为虚函数后,其派生类中的同名函数都自动成为虚函数。
4、定义一个指向基类对象的指针变量,并使它指向同一类族中需要调用该函数的对象。
5、通过指针变量调用此虚函数,此时调用的就是指针变量指向的对象的同名函数。
静态关联(函数重载)、早期关联/动态关联/滞后关联(程序运行阶段的多态性)
虚函数使用注意:
1、只能使用virtual声明类的成员函数,而不能将类外的普通函数声明为虚函数。
2、一个成员函数被声明为虚函数后,在同一类族中的类就不能再定义一个非virtual的但是与该虚函数具有相同的参数(包括个数和类型)和返回值类型的同名函数。
虚析构函数:
virtual ~classname( ) { ... }
如果将基类的析构函数声明为虚函数,由该基类所派生的析构函数也都自动成为虚函数(即使派生类的析构函数与基类的析构函数名字不相同)。最好把基类的析构函数声明为虚函数。
纯虚函数与抽象类:
virtual 函数类型 函数名( 参数列表 ) =0;
纯虚函数没有函数体。
如果一个类中声明了纯虚函数,而在其派生类中没有对该函数定义,则该虚函数在派生类中仍然为纯虚函数。
抽象类:
1、唯一目的的就是用它去建立派生类,不能用来定义对象,只做为一种基本类型。
2、凡是包含纯虚函数的类都是抽象类,因为纯虚函数是不能被调用的,包含纯虚函数的类是无法建立对象的。
3、虽然抽象类不能定义对象,但是可以定义指向抽象类数据的指针变量。