纯虚函数和抽象类

纯虚函数和抽象类

1620863272021

1620863367789

1620863228601

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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#define  _CRT_SECURE_NO_WARNINGS 
#include <iostream>
#include <string>
using namespace std;

//图形类
//拥有纯虚函数的类, 就叫抽象类
class Shape
{
public:
//是一个抽象的接口,说明图形是有一个得到面积方法
virtual double getArea() = 0;//代表一个接口,一个求图形面积的接口

//定义一个个打印面积的接口
virtual void print() = 0;
};

//圆类
//如果 一个子类继承了抽象类, 那么一定要重写这个纯虚函数。
class Circle :public Shape
{
public:
Circle(double r)
{
this->r = r;
}

//重写父类抽象类的纯虚函数
virtual double getArea()
{
return 3.14 * r * r;
}


virtual void print() {
cout << "圆的面积是" << endl;
cout << this->getArea() << endl;
}

private:
double r;//半径
};


//实现一个正方形
class Rect :public Shape
{
public:
Rect(double a)
{
this->a = a;
}
//是一个抽象的接口,说明图形是有一个得到面积方法
virtual double getArea()
{
return a*a;
}

//顶一个打印面积的接口
virtual void print() {
cout << "正方形的面积是" << endl;
cout << this->getArea() << endl;
}
private:
double a;//边长
};

//三角形
class Tri :public Shape
{
public:
Tri(double a, double h)
{
this->a = a;
this->h = h;
}
virtual double getArea() {
return 0.5 * h * a;
}

virtual void print() {
cout << "三角形的面积是" << endl;
cout << this->getArea() << endl;
}

private:
double a;//底
double h;//高
};


//一个传递抽象类 指针的架构函数
void printArea(Shape *p)
{
p->print();
}

//业务层
int main(void)
{
//Shape p;//抽象类不能够实例化

Shape *sp = new Circle(10.0);

//抽象类的指针就可以调用纯虚函数, 接口
//sp->getArea();//在此处就发生了多态
//cout << sp->getArea() << endl;

//delete sp;

printArea(sp);

delete sp;

//创建一个正方形的对象。用抽象类指针(父类指针)指向子类对象
sp = new Rect(10.0);

printArea(sp);
delete sp;

//业务层 根本就不关心 具体对象怎么实现的, 只用抽象类的指针就可以。
Shape *sp2 = new Tri(10, 20);
sp2->print();
delete sp2;

cout << " ------ " << endl;

return 0;
}