纯虚函数(pure virtual function)是指在基类中声明但是没有定义的虚函数。
通用形式:
virtual type func-name(parameter-list)=0;
其中,type 是函数的返回类型,
func-name 是函数名。
=0 是把虚函数制定为纯虚函数。
通过虚函数申明为纯虚函数可以强制在派生类中重新定义虚函数。(否则编译器报错)
如果一个类至少含有一个纯虚函数,那么这个类被称为抽象类(abstract class).
- 抽象类的重要特征:不能定义抽象类型的对象,抽象类只能作为其他类的基类,不能用来声明对象。
- 抽象类可以用来声明指针或者引用,并以此支持运行时对态。
//这个程序编译报错,因为circle类没有覆盖show_area(); #include <iostream> using namespace std; class figure{ //基类为抽象类.(因为包含了纯虚函数) protected: double x,y; public: void set_dim(double i,double j){ x=i; y=j; } virtual void show_area()=0; //纯虚函数. }; class triangle:public figure{ public: void show_area(){ cout<<"Triangle with base "<<x; cout<<" and height "<<y; cout<<" has an area of "<<x*y*0.5<<".\n"; } }; class rectangle:public figure{ public: void show_area(){ cout<<"Rectangle with dimensions "; cout<<x<<","<<y; cout<<" has an area of "; cout<<x*y<<".\n"; } }; class circle:public figure{ //没有重新定义函数show_area(),产生错误. }; int main(){ figure *p; //声明基类的指针 triangle tri_obj; //声明派生类对象 rectangle rect_obj; circle cir_obj; //非法-不能被创建 p=&tri_obj; p->set_dim(6.0,8.0); p->show_area(); //将显示三角形面积 24 p=&rect_obj; p->set_dim(10.0,3.0); p->show_area(); //将显示长方形面积 30 return 0; }
编译结果:
error C2259: 'circle' : cannot instantiate abstract class
due to following members:
'void figure::show_area(void)' : is abstract