考试题型:主要在选择题、填空题、程序分析题和程序设计题,比分占15%左右。
第一节 多态的基本概念(重点)
1、C++面向对象的三种机制:封装、继承和多态,封装使代码模块化,继承实现代码复用,多态则是为了接口复用。
多态分为编译时多态和运行时多态:
静态联编(静态绑定,早绑定)所支持的多态性称为编译时的多态性。当调用重载函数时,编译器可以根据调用时使用的实参在编译时就确定下来应调用哪个函数。
动态联编(也叫动态绑定,晚绑定)所支持的多态性称为运行时的多态性,这由虚函数来支持。虚函数类似于重载函数,但与重载函数的实现策略不同,即对虚函数的调用使用动态联编。
2、在类之间满足赋值兼容的前提下,实现动态绑定必须满足两个条件:
(1)必须声明虚函数;
(2)通过基类类型的引用或指针调用虚函数。
3、虚函数只能是类中的一个成员函数,但不能是静态成员,关键字virtual用于类中该函数的声明中。
当在派生类中定义了一个同名的成员函数时,只要该成员函数的参数个数和相应类型以及它的返回类型与基类中同名的虚函数完全一样,则无论是否为该成员使用virtual,他都将成为一个虚函数。
4、声明虚函数成员的一般格式:
Virtual 函数返回值类型 函数名(形参表);
基类中声明为virtual的函数一般在派生类中需要重新定义。在重新定义时,参数的类型和个数必须相同,一旦一个函数被声明为虚函数,则无论声明它的类被继承了多少层,在每一层派生类中该函数都保持虚函数特性。
5、关于虚函数注意以下几点:
(1)虚函数一般不申明为内联函数
(2)静态成员函数和友元函数不能申明为虚函数
(3)声明时加virtual,虚函数在类体外不加virtual关键词
(4)构造函数不能定义为虚函数
(5)不要在构造函数和析构函数中定义虚函数
第三节 多态的使用
1、在普通成员函数(静态成员函数、构造函数、析构函数除外)中调用其他虚成员函数也是允许的,并且是多态。
2、可以在构造函数和析构函数中调用虚函数,但调用的虚函数不是多态。
3、如何区分:多态与非多态,多态必须满足的条件:使用基类的指针或者引用调用基类中声明的虚函数。
第四节 虚析构函数
1、虚析构函数的作用:析构函数是为了在对象不被使用之后释放它的资源,虚函数是为了实现多态。那么把析构函数声明为virtual有什么作用呢?
为了避免内存泄漏,而且是当子类中会有指针成员变量时才会使用到。即虚析构函数使得在删除指向子类对象的基类指针时,可以调用子类的析构函数来实现释放子类中堆内存的目的,从而防止内存泄漏。
一般来说,一个类如果定义了虚函数,则最好将析构函数也定义成虚函数。不过切记,构造函数不能是虚函数。
2、声明虚析构函数的格式:
virtual ~类名();
虚析构函数没有返回值类型,没有参数。
如果一个类的析构函数是虚函数,则由它派生的所有子类的析构函数也是虚析构函数。使用虚析构函数的目的是为了在对象消亡时实现多态。保证使用基类类型的指针能够调用适当的析构函数针对不同的对象进行清理工作。
第五节 纯虚函数和抽象类(难点)
1、纯虚函数在声明时要在函数原型的后面赋0,其声明格式如下:
virtual <返回值类型><函数名>(<参数表>)=0;
函数声明为纯函数后,就不用给出具体的定义。
纯虚函数相当于一个统一的接口类型
2、如果一个类中至少包含一个纯虚函数,这个类就被称为抽象类。
抽象类特点如下:
(1)抽象类至少包含一个没有给出具体实现的纯虚函数,抽象类无法实例化,不能定义对象;
(2)抽象类不能作为形参类型、函数返回类型或转换类型,但是可以定义抽象类指针和引用指向公有派生对象,实现动态多态性。
(3)在抽象类中可以定义普通成员函数和虚函数,仍然可以通过派生类对象来调用这些不是纯虚函数的函数。
(4)不允许从非抽象类(即不包含纯虚函数的类)派生出抽象类。
3、如果一个派生类有多个基类,而这些直接基类又有一个共同的基类,则在最终的派生类中会保留该间接共同基类数据成员的多份同名成员。
在引用这些同名的成员时,必须在派生类对象名后增加直接基类,以避免产生二义性,使其唯一地标识一个成员,如
c1.A: :display( )
在一个类中保留间接共同基类的多份同名成员,这种现象是人们不希望出现的。C++提供虚基类(virtual base class)的方法,使得在继承间接共同基类时只保留一份成员。
例:将类A声明为虚基类,方法如下:
class A //声明基类A
{···};
class B:virtual public A {···};//声明类B是类A的公用派生类,A是B的虚基类
class C:virtual public A {···};//声明类C是类A的公用派生类,A是C的虚基类
注意:
虚基类并不是在声明基类时声明的,而是在声明派生类时,指定继承方式时声明的。因为一个基类可以在生成一个派生类时作为虚基类,而在生成另一个派生类时不作为虚基类。
声明虚基类的一般形式为:
class 派生类名:virtual 继承方式 基类名
经过这样的声明后,当基类通过多条派生路径被一个派生类继承时,该派生类只继承该基类一次。需要注意:为了保证虚基类在派生类中只继承一次,应当在该基类的所有直接派生类中声明为虚基类。否则仍会出现对基类的多次继承。



