zoukankan      html  css  js  c++  java
  • 虚函数抽象类c++中的抽象类(纯虚函数)

    在本篇文章中,我们主要介绍虚函数抽象类的内容,自我感觉有个不错的建议和大家分享下

        1、在基类中不能给出有意义的虚函数定义,这时可以把它说明成纯虚函数,把它的定义留给派生类来做
    2、定义纯虚函数:
     class 类名{
            virtual 返回值类型 函数名(参数表) = 0;
        };
    3、纯虚函数不需要实现

         

         

        #include <iostream>
    #include<vector>
    using namespace std;

        class Shape
    {
    public:
     virtual void Draw()=0;
     virtual ~Shape()//如果不是纯虚函数,则派生类析构函数不能执行,会形成内存泄漏问题

         {

          cout<<"~Shape().........."<<endl;
     }
    };
    class Circle:public Shape
    {
    public:
     void Draw()
     {
      cout<<"Circle::Draw().........."<<endl;
     }
     ~Circle(){
      cout<<"~Circle().........."<<endl;
     }
    };
    class Square:public Shape
    {
    public:
     void Draw()
     {
      cout<<"Square::Draw().........."<<endl;
     }
     ~Square()
     {
      cout<<"Square::~Square().........."<<endl;
     }
    };
    class Retangle:public Shape
    {
    public:
     void Draw()
     {
      cout<<"Square::Retangle().........."<<endl;
     }
     ~Retangle()
     {
      cout<<"Retangle::~Retangle().........."<<endl;
     }
    protected:
    private:
    };

         

        void DrawAllShape(vector<Shape*> v)
    {
     vector<Shape*>::const_iterator it;

         for (it=v.begin();it!=v.end();++it)
     {
      Shape* s=(*it);
      s->Draw();
     }
    }

        每日一道理
    聪明人学习,像搏击长空的雄鹰,仰视一望无际的大地;愚笨的人学习,漫无目的,犹如乱飞乱撞的无头飞蛾;刻苦的人学习,像弯弯的河流,虽有曲折,但终会流入大海;懒惰的人学习,像水中的木头,阻力越大倒退得越快。

        void DeleteAllShape(vector<Shape*> v)
    {
     vector<Shape*>::const_iterator it;

         for (it=v.begin();it!=v.end();++it)
     {
      
      delete (*it);
     }
    }
    //
    class  ShapeFactory
    {
    public:

         static Shape* CreateFactory(const string& name){
      Shape *ps=0;
      if (name.compare("Circle"))
      {
        ps=new Circle;
      }
      else if(name.compare("Square"))
      {
       ps=new Square;
      }else if (name.compare("Retangle"))
      {
       ps=new Retangle;
      }
      return ps;
     }
    protected:
    private:
    };

         

        int main()
    {
    // Shape s; error ,抽象类不能实例化
     //Circle c;
     //c.Draw();

         Shape* ps;

         vector<Shape*> ve;
       /* ps=new Circle;

         ve.push_back(ps);

         ps=new Square;

         ve.push_back(ps);

         ps=new Retangle;

         ve.push_back(ps);*/

         ps=ShapeFactory::CreateFactory("Circle");
     ve.push_back(ps);
     ps=ShapeFactory::CreateFactory("Square");
     ve.push_back(ps);
     ps=ShapeFactory::CreateFactory("Retangle");
     ve.push_back(ps);
     DrawAllShape(ve);
     DeleteAllShape(ve);
     return 0;
    }

        //1、抽象类只能作为基类来应用
    //2、不能声明为抽象类的对象
    //3、构造函数不能是虚函数,析构函数可所以虚函数
    //4、抽象类不能用于直接创建对象实例
    //5、可应用指向抽象类的指针支持运行时多态性
    //6、派生类中必须实现抽象类中的纯虚函数,否则它仍将被看作一个抽象类

    文章结束给大家分享下程序员的一些笑话语录: 某程序员对书法十分感兴趣,退休后决定在这方面有所建树。花重金购买了上等的文房四宝。一日突生雅兴,一番磨墨拟纸,并点上了上好的檀香,颇有王羲之风 范,又具颜真卿气势,定神片刻,泼墨挥毫,郑重地写下一行字:hello world.

    --------------------------------- 原创文章 By 虚函数和抽象类 ---------------------------------

  • 相关阅读:
    多个类定义attr属性重复的问题:Attribute "xxx" has already been defined
    好用的批量改名工具——文件批量改名工具V2.0 绿色版
    得到ImageView中drawable显示的区域的计算方法
    得到view坐标的各种方法
    实现类似于QQ空间相册的点击图片放大,再点后缩小回原来位置
    Material Designer的低版本兼容实现(五)—— ActivityOptionsCompat
    Android 自带图标库 android.R.drawable
    解决 Attempting to destroy the window while drawing!
    解决Using 1.7 requires compiling with Android 4.4 (KitKat); currently using API 4
    Material Designer的低版本兼容实现(四)—— ToolBar
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3095438.html
Copyright © 2011-2022 走看看