C++学习基础十二——纯虚函数与抽象类
一、C++中纯虚函数与抽象类:
1、含有一个或多个纯虚函数的类成为抽象类,注意此处是纯虚函数,而不是虚函数。
2、如果一个子类继承抽象类,则必须实现父类中的纯虚函数,否则该类也为抽象类。
3、如果一个类中含有虚函数,则必须将该类的析构函数声明为虚函数。
4、虚函数与纯虚函数的声明:
virtual void draw();//虚函数
virtual void draw() = 0;//纯虚函数
5、C++中支持两种多态性:
编译时多态:通过重载函数实现。
运行时多态:通过虚函数实现。
二、Java抽象函数与抽象类:
1、含有抽象方法的类成为抽象类,但抽象类不一定含有抽象方法。抽象类不能创建实例。
2、抽象方法必须使用abstract关键字修饰。
3、如果非抽象子类继承抽象类,则必须重写父类中所有的抽象方法。
三、C++接口:一个类中除了构造函数和析构函数外,只有纯虚函数,则该类成为接口 。
四、代码实现:
1 #include <iostream> 2 3 using namespace std; 4 5 //含有一个或多个纯虚函数的类成为抽象类,注意:此处指的是纯虚函数而不是虚函数 6 //纯虚函数的定义:virtual void draw() = 0; 7 //如果继承抽象类,则必须实现父类中所有的纯虚函数,否则该子类也为抽象类 8 //如果一个类中包含虚函数,则必须将本类的析构函数声明为虚函数。 9 class Shape 10 { 11 public: 12 Shape(){ 13 } 14 virtual ~Shape(){ 15 } 16 virtual double getArea() = 0;//纯虚函数 17 virtual double getP() = 0; 18 virtual void draw() = 0; 19 }; 20 21 class Circle : public Shape 22 { 23 public: 24 Circle(double r):itsRadius(r){ 25 } 26 virtual ~Circle(){ 27 28 } 29 double getArea(){ 30 return 3.14 * itsRadius * itsRadius; 31 } 32 double getP(){ 33 return 2 * 3.14 * itsRadius; 34 } 35 void draw(){ 36 cout<<"draw Circle..."<<endl; 37 } 38 private: 39 double itsRadius; 40 } ; 41 42 class Rectangle : public Shape 43 { 44 public: 45 Rectangle(int w,int h):wid(w),hei(h){ 46 } 47 virtual ~Rectangle(){ 48 } 49 double getArea() 50 { 51 return wid * hei; 52 } 53 double getP() 54 { 55 return 2*(wid + hei); 56 } 57 void draw() 58 { 59 for(int i = 0;i < 5;i++) 60 { 61 for(int j = 0;j < 4;j++) 62 { 63 cout<<"X "; 64 } 65 cout<<endl; 66 } 67 } 68 private: 69 int wid; 70 int hei; 71 }; 72 int main() 73 { 74 int number; 75 bool flag = false; 76 77 Shape *shape; 78 while(flag == false) 79 { 80 cout<<"请输入数字:(1)圆形 (2)矩形 (0)退出:"; 81 cin>>number; 82 switch(number) 83 { 84 case 1: 85 shape = new Circle(10.0); 86 break; 87 case 2: 88 shape = new Rectangle(13,15); 89 break; 90 case 0: 91 flag = true; 92 break; 93 } 94 95 if(flag == false) 96 { 97 shape->draw(); 98 delete shape; 99 } 100 } 101 return 0; 102 }
后续更新中....