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 }

后续更新中....

原文地址:https://www.cnblogs.com/calence/p/5914742.html