zoukankan      html  css  js  c++  java
  • C++网易云课堂开发工程师--虚函数与多态

    Inheritance(继承),表示is-a

    non-virtual 函数:不希望derived class 重新定义(override,复写)

    virtual函数:希望derived class重新定义它(override,复写)它,并且它已经有默认定义。

    pure-virtual函数(纯虚函数):希望derived class一定要重新定义(override)它,你对它没有默认定义。

    class Shape{

      public:

        virtual void draw() const = 0;                        //纯虚函数

        virtual void error(const std::string& msg);

        int objectID() const;  

    };

    class Rectangle: public Shape{...};

    class Ellipse: public Shape{...};

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Inheritance(继承) with virtual

    Template Method 模板方法模式

    Application framework                               Application

    CDocument::OnFileOpen( ){                        class CMyDoc:  public CDocument{

      serialize( );                                  virtual Serialize( )  {...}

    }                                    };

                                         main( ){

                                            CMyDoc myDoc;

                                            ...

                                            myDoc.OnFileOpen( );

                                         }

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    #include<iostream>

    using namespace std;

    class CDocument{

      public:

        void OnFileOpen( ){

        //这是一个算法,每个cout输出代表一个实际动作

        cout << "dialog..." << endl;

        cout << "check file status ..." << endl;

        Serialize( );

        cout << "close file ..." << endl;

      }

      virtual void Serialize( )  { };

    };

    class CMyDoc : public CDocument{

      public:

        virtual void Serialize ( ){

        //只有应用程序本身才知道如何读取自己的文件

        cout << "重写虚函数" << endl;

      }

    };

    int main( ){

      CMyDoc myDoc( );

      myDoc.OnFile( );

    }

    继承与复合关系下的构造和析构

     

    委托+继承

    class Subject{

      int m_value;

      vector<Observer*>  m_views;

      public:

        void attach(Observer* obs){

          m_views.push_back(obs);

        }

        void set_val(int value){

          m_value = value;

          notify( );

        }

        void notify( ){

          for(int i = 0; i < m_views.size( ); ++i){

            m_views[i]->update(this, m_value);

          }

        }

    }

    Observer

    class Observer{

      public:

        virtual void update(object* sub, int value);

    }

  • 相关阅读:
    Plugs介绍(翻译) .net/C#开源操作系统学习系列六
    Cosmos的里程碑2(Mile Stone 2)之浅尝PCI总线、设备编程.net/C#开源操作系统学习系列九
    [翻译] WindowsPhoneGameBoy模拟器开发二Rom文件分析
    Cosmos开篇、本系列目录.net/C#开源操作系统学习系列一
    Cosmos的汇编级调试器(翻译) .net/C#开源操作系统学习系列七
    数据库牛人榜(随时更新)
    redis大key删除
    Linux LVM硬盘管理及LVM扩容
    Linux学习之CentOS(十一)CentOS6.4下Samba服务器的安装与配置
    Linux学习之CentOS(三十)SELinux安全系统基础
  • 原文地址:https://www.cnblogs.com/sky-z/p/9575082.html
Copyright © 2011-2022 走看看