纯虚函数和抽象类

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++编译器不知道子类调用的是继承自哪个父类的普通函数。

如果父类之间重名的函数是纯虚函数,则子类调用该函数时一定不会出现二义性的问题。因为父类中的纯虚函数相当于是定义封装了函数接口,在子类中必然会重写纯虚函数,对该纯虚函数做具体的实现,函数调用时调用的一定是子类的函数。

原文地址:https://www.cnblogs.com/jswu-ustc/p/8398152.html