C++入门笔记(九)

1.纯虚函数与抽象类

1.1纯虚函数

首先:强调一个概念

定义一个函数为虚函数,不代表函数为不被实现的函数。

定义他为虚函数是为了允许用基类的指针来调用子类的这个函数。

定义一个函数为纯虚函数,才代表函数没有被实现。

定义纯虚函数是为了实现一个接口,起到一个规范的作用,规范继承这个类的程序员必须实现这个函数。

image-20210415131524794

1.2抽象类

类似Java中抽象方法与抽象类的区别,只是在基类中说明,具体实现交给派生类。

image-20210415131904033

image-20210415131917288

1.3应用抽象类建立栈与队列

两种类型的表(list):栈与队列。

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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#include <iostream>
#include <cstdio>
using namespace std;
class list{ // 声明一个抽象类
public:
list* head; // 表头指针
list* tail; // 表尾指针
list* next;
int num;
list(){
head=tail=next=NULL;
}
virtual void store(int i) = 0; // 纯虚函数
virtual int retrieve() = 0;
};
class queue:public list{
public:
void store(int i);
int retrieve();
};
void queue::store(int i){ // 定义虚函数
list* item;
item = new queue;
if (!item){
cout << "Allocation error\n";
exit(1);
}
item->num = i;
if (tail) tail->next = item;
tail = item;
item->next = NULL;
if (!head) head = tail;
}
int queue::retrieve(){
int i;
list* p;
if (!head){
cout << "list empty\n";
return 0;
}
i = head->num;
p = head;
head = head->next;
delete p;
return i;
}
class stack:public list{
public:
void store(int i);
int retrieve();
};
void stack::store(int i){
list* item;
item = new stack;
if (!item){
cout << "Allocation error\n";
exit(1);
}
item->num = i;
if (head) item->next = head;
head = item;
if (!tail) tail = head;
}
int stack::retrieve(){
int i;
list* p;
if (!head){
cout << "list empty\n";
return 0;
}
i = head->num;
p = head;
head = head->next;
delete p;
return i;
}
int main(){
list* p; // 定义指向抽象类list的指针p
queue q_ob;
p = &q_ob; // p指向queue对象q_ob
p->store(1);
p->store(2);
p->store(3);
cout << "queue:";
for (int i = 0;i < 3;i ++) cout << p->retrieve();
cout << '\n';
stack s_ob;
p = &s_ob;
p->store(1);
p->store(2);
p->store(3);
cout << "stack:";
for (int i = 0;i < 3;i ++) cout << p->retrieve();
cout << '\n';
return 0;
}
坚持原创技术分享,您的支持将鼓励我继续创作!