定义

在C++中, 可以将虚函数声明为纯虚函数, 格式为:

1
virtual 返回值类型 函数名 (函数参数列表) = 0;

纯虚函数没有函数体, 只有函数声明, 在虚函数声明的结尾加上=0, 表明此函数为纯虚函数。最后的=0并不表示函数返回值为0, 它只起形式上的作用, 告诉编译系统"这是纯虚函数"。

包含纯虚函数的类成为抽象类(Abstract Class)。之所以说它抽象, 是因为它无法被实例化, 也就是无法创建对象。原因很明显, 纯虚函数没有函数体, 不是完整的函数, 无法调用, 也无法为其分配内存空间。

  1. 抽象类通常是作为基类, 让派生类去实现纯虚函数, 派生类必须实现纯虚函数才能被实例化;
  2. 抽象基类处理约束派生类的功能, 还可以实现多态;
  3. 一个纯虚函数就可以使类成为抽象基类, 但是抽象基类除了包含纯虚函数之外, 还可以包含其他的成员函数(虚函数或普通函数)和成员变量;
  4. 只有类中的虚函数才能被声明为纯虚函数, 普通成员函数和顶层函数均不能被声明为纯虚函数;

示例

继承关系:Line --> Rectangle --> Cuboid --> Cube

抽象类: Line, Rectangle(实现了area()但是没有实现volume())

Line不需要被实例化, 但是他为派生类提供了约束条件, 派生类必须要实现这两个函数, 完成计算面积和计算体积的功能,否则就不能实例化。可以定义一个抽象基类, 只完成部分功能, 未完成的功能交给派生类实现(谁派生谁实现)。这部分未完成的功能, 往往是基类不需要的, 或者在基类中无法实现的。虽然抽象基类没有完成, 但是却强制要求派生类完成。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include <iostream>
using namespace std;

//线段
class Line {
protected:
int _len;
public:
Line(int len) : _len(len) {}
virtual int area() = 0;
virtual int volume() = 0;
};

//矩形
class Rectangle : public Line {
protected:
int _wid;
public:
Rectangle(int len, int wid) : Line(len), _wid(wid) {}
int area() {
return _wid * _len;
}
};

// 长方体
class Cuboid : public Rectangle {
protected:
int _hei;
public:
Cuboid(int wid, int len, int hei) : Rectangle(wid, len), _hei(hei) {}
virtual int area() {
return 2 * (_wid * _len + _wid * _hei + _len * _hei);
}
virtual int volume() {
return _wid * _len * _hei;
}
};

//正方体
class Cube : public Cuboid {
public:
Cube(int a) : Cuboid(a, a, a) {}
Cube(int a, int b, int c) : Cuboid(a, b, c) {}
int area() {
return 6 * _wid * _hei;
}
int volume() {
return _wid * _hei * _len;
}
};

int main(void){
Line *p = new Cuboid(10, 20, 30);
cout << "The area of Cuboid is " << p->area() << endl;
cout << "The volume of Cuboid is " << p->volume() << endl;

p = new Cube(15);
cout << "The area of Cube is " << p->area() << endl;
cout << "The volume of Cube is " << p->volume() << endl;

return 0;
}

/*
==============================
The area of Cuboid is 2200
The volume of Cuboid is 6000
The area of Cube is 1350
The volume of Cube is 3375
==============================
*/