• c++之NVI手法


    non-virtual interface(NVI)手法:令用户通过public non-virtual成员函数间接调用private virtual函数,将这个non-virtual函数称为virtual函数的wrapper.wrapper确保得以在一个virtual函数被调用之前设定好适当场景,并在调用结束之后清理场景.注意此时用指针或引用调用该non-virtual成员函数时,该non-virtual成员函数调用的virtual函数取决于指针或引用的动态类型,即存在多态

    enum ShapeColor { Red, Green, Blue };
    class Shape
    {
    public:
        void draw(ShapeColor color = Red) const
        {
            doDraw(color);
        }
    private:
        virtual void doDraw(ShapeColor color) const = 0;
    };
    
    class Rectangle :public Shape
    {
    public:
    
    private:
        virtual void doDraw(ShapeColor color) const;
    };
    
    void Rectangle::doDraw(ShapeColor color) const
    {
        cout << "Rectangle's doDraw" << "color= " << color << endl;
    }
    
    void main()
    {
        Shape*p = new Rectangle;
            ////输出:Rectangle's doDrawcolor= 0
        p->draw();
        system("pause");
    }

    enum ShapeColor { Red, Green, Blue };
    class Shape
    {
    public:
        void draw(ShapeColor color = Red)const
        {
            doDraw(color);
        }
    private:
        virtual void doDraw(ShapeColor color) const
        {
            cout << "Shape's doDraw" << "color= " << color << endl;
        }
    };
    
    class Rectangle :public Shape
    {
    public:
    
    private:
        virtual void doDraw(ShapeColor color) const;
    };
    
    void Rectangle::doDraw(ShapeColor color) const
    {
        cout << "Rectangle's doDraw" << "color= " << color << endl;
    }
    
    /*
    输出:
    Shape's doDrawcolor= 0
    Rectangle's doDrawcolor= 0
    */
    void main()
    {
        Shape*p = new Shape;
        p->draw();
        delete p;
        p = NULL;
        Shape*q = new Rectangle;
        q->draw();
        delete q;
        q = NULL;
    
        system("pause");
    }

    enum ShapeColor { Red, Green, Blue };
    class Shape
    {
    public:
    
        void draw(ShapeColor color = Red)const
        {
            doDraw(color);
        }
    private:
        void doDraw(ShapeColor color) const
        {
            cout << "Shape's doDraw" << "color= " << color << endl;
        }
    };
    
    class Rectangle :public Shape
    {
    public:
    
    private:
        void doDraw(ShapeColor color) const;
    };
    
    void Rectangle::doDraw(ShapeColor color) const
    {
        cout << "Rectangle's doDraw" << "color= " << color << endl;
    }
    /*
    输出:
    Shape's doDrawcolor= 0
    Shape's doDrawcolor= 0
    */
    int main()
    {
        Shape*p = new Shape;
        p->draw();
        delete p;
        p = NULL;
        Shape*q = new Rectangle;
        q->draw();
        delete q;
        q = NULL;
    
        system("pause");
        return 0;
    }
  • 相关阅读:
    IGeoDatabaseBridge2.GetLineOfSight
    selenium+python自动化测试--alert弹框
    web页面兼容性测试之browsershots工具使用
    selenium自动化测试之定位大全
    Android adb 命令大全
    接口自动化测试 httprunner+locust+python 安装与实践
    appium-uiautomator2-server-v0.x.x.apk does not exist or is not accessible 报错解决方法
    python基础3
    python1、2实践
    python基础2
  • 原文地址:https://www.cnblogs.com/ljygoodgoodstudydaydayup/p/5813163.html
Copyright © 2020-2023  润新知