zoukankan      html  css  js  c++  java
  • C++:纯虚函数与抽象类

    5.4.3 纯虚函数和抽象类

    纯虚函数是一个在基类中说明的虚函数,它在该基类中没有定义,但是要求在派生类中根据需要对它进行定义,或仍然说明为纯虚函数。


    声明纯虚函数的一般格式是:
    virtual 函数类型 函数名(参数表)=0;

    纯虚函数的作用是:在基类中为其派生类保留一个函数的名字,以便派生类根据需要对它进行重新定义。纯虚函数没有函数体,它最后面“=0 ”并不表示函数的返回值是0,它只是形式上的作用,告诉编译系统这是纯虚函数。纯虚函数不具有函数的功能,不能被调用。

    //应用举例

    #include<iostream>
    using namespace std;
    #define PI 3.14 
    class Circle{                   //基类(抽象类) 
      public: 
       void setradius(double r)
       {
        radius = r;
       } 
       virtual void show()=0;        //在基类里定义纯虚函数 
      protected:
       double radius;  
    };
    class Area:public Circle{
      public:
        void show()                 //在派生类Area中重新定义虚函数函数show 
        {
         cout<<"圆的面积是:"<<PI*radius*radius<<endl;
        }
    };
    class Perimeter:public Circle{
      public:
        void show()                 //在派生类Perimeter中重新定义虚函数函数show 
        {
         cout<<"圆的周长是:"<<2*PI*radius<<endl;
        }
    };
    int main()
    {
     Circle *ptr;           //定义(抽象类)基类circle对象指针ptr
     Area a;               //定义Area对象a
     a.setradius(10);
     ptr=&a;
     ptr->show(); 
     Perimeter p;          //定义Perimeter对象p
     p.setradius(10);
     ptr=&p;
     ptr->show();
     return 0; 
    }

    程序运行结果:
    圆的面积是:314
    圆的周长是:62.8

    在以上例子中,Circle是一个基类,它表示一个圆。从它可以派生出面积类Area和周长类Perimeter。显然,基类中定义的show函数是没有任何意义的,它只是用来提供派生类使用的公共接口,所以在程序中将其定义为纯虚函数,但在派生类中,则根据程序的需要,具体地重新定义纯虚函数。如果一个类至少有一个纯虚函数,那么就称为这个类为抽象类。因此,上述程序中定义的类Circle就是一个抽象类。对于抽象类的使用有以下几点规定:

    (1)由于抽象类中至少包含有一个没有定义功能的纯虚函数,因此抽象类只能用其他类的基类,不能建立抽象类的对象。


    (2)抽象类不能用作参数类型、函数返回类型或显式转换的类型。但是可以声明指向抽象类的的指针变量,此指针可以指向它的派生类,进而实现多态性。


    (3)如果在抽象类的派生类中没有重新说明纯虚函数,则该函数在派生类中仍然为纯虚函数,而这个派生类仍然还是一个派生类。

  • 相关阅读:
    离线计算框架 MapReduce
    Hadoop概述
    Linux之rpm/yum
    Linux之磁盘分区
    利用CMD合并多个VOB文件
    android中的simple_list_item
    jquery中的跨域-jsonp格式
    安卓代码中设置ImageView属性
    Android中常用的Adapter的种类和用法
    C#导入excel文件到oracle的方法
  • 原文地址:https://www.cnblogs.com/XYQ-208910/p/4912682.html
Copyright © 2011-2022 走看看