zoukankan      html  css  js  c++  java
  • Return to the Basic 纯虚函数(pure virtual)和抽象类(abstract class)

    纯虚函数(pure virtual function)是指在基类中声明但是没有定义的虚函数。
    通用形式:

    virtual type func-name(parameter-list)=0;


    其中,type 是函数的返回类型,
    func-name 是函数名。
    =0 是把虚函数制定为纯虚函数。

    通过虚函数申明为纯虚函数可以强制在派生类中重新定义虚函数。(否则编译器报错)

    如果一个类至少含有一个纯虚函数,那么这个类被称为抽象类(abstract class).
    - 抽象类的重要特征:不能定义抽象类型的对象,抽象类只能作为其他类的基类,不能用来声明对象。
    - 抽象类可以用来声明指针或者引用,并以此支持运行时对态。

    //这个程序编译报错,因为circle类没有覆盖show_area(); 
    #include <iostream>
    using namespace std;
    
    class figure{     //基类为抽象类.(因为包含了纯虚函数)
    protected:
     double x,y; 
    public:
     void set_dim(double i,double j){
      x=i;
      y=j;
     }
     virtual void show_area()=0; //纯虚函数.
    };
    
    class triangle:public figure{
    
    public:
     void show_area(){
      cout<<"Triangle with base "<<x;
      cout<<" and height "<<y;
      cout<<" has an area of "<<x*y*0.5<<".\n";
     }
    };
    
    class rectangle:public figure{
    
    public:
     void show_area(){
      cout<<"Rectangle with dimensions ";
      cout<<x<<","<<y;
      cout<<" has an area of ";
      cout<<x*y<<".\n";
     }
    };
    
    class circle:public figure{
     //没有重新定义函数show_area(),产生错误.
    };
    int main(){
     figure *p;    //声明基类的指针
     triangle tri_obj;   //声明派生类对象
     rectangle rect_obj;
    
     circle cir_obj; //非法-不能被创建
    
     p=&tri_obj;
     p->set_dim(6.0,8.0);
     p->show_area();   //将显示三角形面积 24
    
     p=&rect_obj;
     p->set_dim(10.0,3.0);
     p->show_area();   //将显示长方形面积 30
    
     return 0;
    }


    编译结果:

     error C2259: 'circle' : cannot instantiate abstract class
           due to following members:
            'void figure::show_area(void)' : is abstract

  • 相关阅读:
    ubuntu 16.04 安装 python selenium
    DNS 小问题
    Ubuntu下安装setuptools
    ubuntu16.04LTS更换阿里源
    Ubuntu下安装 Phantomjs
    root和user切换
    Navicat破解安装教程
    urllib2
    MySQL划重点-查询-聚合-分组
    vi编辑器
  • 原文地址:https://www.cnblogs.com/fdyang/p/2858745.html
Copyright © 2011-2022 走看看