Fork me on GitHub

C++虚函数(09)

一旦基类定义了虚函数,该基类的派生类中的同名函数也自动称为虚函数。

虚函数只能是类中的一个成员函数,但不能是静态成员,关键字virtual用于类中该函数的声明中。

关键字virtual指示C++编译器对调用虚函数进行动态联编。这种多态性是程序运行到需要的语句处才动态确定的,所以称为运行时的多态性。不过,使用虚函数并不一定产生多态性,也不一定使用动态联编。例如,在调用中对虚函数使用成员名限定,可以强制C++对该函数的调用使用静态联编。

产生运行时的多态性有如下3个前提:  

(1)类之间的继承关系满足赋值兼容性规则。

(2)改写了同名函数。  

(3)根据赋值兼容性规则使用指针(或引用)。

由于动态联编是在运行时进行的,相对于静态联编,它的运行效率比较低,但它可以使程序员对程序进行高度抽象,设计出可扩充性好的程序。

纯虚函数与抽象类

在许多情况下,不能再基类中为虚函数给出一个有意义的定义,这时可以将它说明为纯虚函数,将其定义留给派生类去做。说明纯虚函数的一般形式如下:  

class 类名{  
virtual 函数类型 函数名(参数列表)=0;
};

一个类可以说明多个纯虚函数,包含有纯虚函数的类称为抽象类。一个抽象类只能作为基类来派生新类,不能说明抽象类的对象。但可以说明指向抽象类对象的指针(或引用)。

从一个抽象类派生的类必须提供纯虚函数的实现代码,或在该派生类中仍将它说明为纯虚函数,否则编译器将给出错误信息。这说明了纯虚函数的派生类仍是抽象类。如果派生类给了某类所有纯虚函数的实现,则该派生类不再是抽象类。

抽象类至少含有一个虚函数,而且至少有一个虚函数是纯虚函数,以便将它与空的虚函数区分开来。下面是两种不同的表示方法:

virtual void area()=0; 
virtual void area(){} 

在成员函数内可以调用纯虚函数。因为没有为纯虚函数定义代码,所以在构造函数或虚构函数内调用一个纯虚函数将导致程序运行错误。

 

posted @ 2017-10-18 21:50  秋夜雨巷  阅读(264)  评论(0编辑  收藏  举报