1.纯虚函数是一个在基类中声明的虚函数,在基类中没有定义,它要个各个派生类都定义自己的版本;
2.纯虚函数为各个派生类提供一个公共界面(接口的封装和设计,软件的模块功能划分);
3.纯虚函数的形式: virtual 类型 函数名(参数列表) = 0;
4.一个具有纯虚函数的基类称为抽象类。
抽象类shape的用法说明:
1.shape x; //error,抽象类不能定义对象
2.shape *p //ok,可以声明抽象类的指针
3.shape fun() //error,抽象类不能作为函数返回类型
4.void fun(shape) //error,抽象类不能作为函数参数类型
5.shape& fun(shape&) //ok,可以声明抽象类的引用
纯虚函数的例子:
1 #include<iostream> 2 using namespace std; 3 4 //抽象类,封装好函数的接口,为下面的派生类搭好框架,则用抽象类的指针(或引用)可以访问派生类的属性 5 class Point 6 { 7 public: 8 virtual float getArea()=0; 9 private: 10 }; 11 12 //派生类 13 class Rectangle:public Point 14 { 15 public: 16 Rectangle(float len,float wid):length(len),width(wid){} 17 virtual float getArea(){return length*width;} 18 private: 19 float length; 20 float width; 21 }; 22 23 //派生类 24 class Circle:public Point 25 { 26 public: 27 Circle(float r):radiu(r){} 28 virtual float getArea(){return 3.1416*radiu*radiu;} 29 private: 30 float radiu; 31 }; 32 33 34 void fun(Point* p) 35 { 36 cout<<p->getArea()<<endl; 37 } 38 39 40 int main() 41 { 42 Rectangle rec(4,5); 43 Circle cir(6); 44 45 fun(&rec); 46 fun(&cir); 47 48 return 0; 49 }
抽象类在多继承中的应用:
一个子类继承了多个父类,父类之间的普通函数如果重名(函数名和函数参数相同),则子类调用该普通函数时会发生二义性,C++编译器不知道子类调用的是继承自哪个父类的普通函数。
如果父类之间重名的函数是纯虚函数,则子类调用该函数时一定不会出现二义性的问题。因为父类中的纯虚函数相当于是定义封装了函数接口,在子类中必然会重写纯虚函数,对该纯虚函数做具体的实现,函数调用时调用的一定是子类的函数。