zoukankan      html  css  js  c++  java
  • C++函数指针和类成员函数指针

    一、函数指针——基本形式

    char Fun(int n) { return char(n); }
    //char(*pFun)(int);
    
    void main()
    {
        char(*pFun)(int);
        pFun = Fun;
        char c = (*pFun)(83);
        cout << c;
    }

    二、函数指针——typedef形式

    char Fun(int n) { return char(n); }
    //typedef char(*PFun)(int);
    //PFun pFun;
    
    void main()
    {
        typedef char(*PFun)(int);
        PFun pFun;
        pFun = Fun;
        char c = (*pFun)(83);
        cout << c;
    }

    三、类成员函数指针

    class Base
    {
    public:
        char Fun(int n) { return char(n); }
    };
    
    //typedef char (Base::*PFun)(int);
    //PFun pFun;
    
    void main()
    {
        typedef char (Base::*PFun)(int);
        PFun pFun;
        pFun = &Base::Fun;
        Base instance;
        char c = (instance.*pFun)(83);
        cout << c;
    }

    四、类成员函数指针——类指针

    class Base
    {
    public:
        char Fun(int n) { return char(n); }
    };
    
    //typedef char (Base::*PFun)(int);
    //PFun pFun;
    
    void main()
    {
        typedef char (Base::*PFun)(int);
        PFun pFun;
        pFun = &Base::Fun;
        Base *pInstance = new Base();
        char c = (pInstance->*pFun)(83);
        delete pInstance;
        cout << c;
    }

    五、类成员函数指针——内部调用(this->*)

    class Base
    {
    public:
        char Fun(int n) { return char(n); }
        char Fun2()
        {
            char (Base::*pFun)(int);
            pFun = &Base::Fun;
            char c = (this->*pFun)(83);
            return c;
        }
    };
    
    void main()
    {
        Base instance;
        char c = instance.Fun2();
        cout << c;
    }

    六、类成员函数指针——继承调用

    class Base
    {
    public:
        char Fun(int n) { return char(n); }
    
        char Fun2(int n)
        {
            //char (Base::*pFun)(int);
            //pFun = &Base::Fun;
            typedef char (Base::*PFun)(int);
            PFun pFun = &Base::Fun;
            return Proc(n, pFun);
        }
    
        char Proc(int n, char(Base::*pFun)(int))
        {
            return (this->*pFun)(n);
        }
    };
    
    class Derive : Base
    {
    public:
        char Fun(int n) { return char(n - 1); }
    
        char Fun2(int n)
        {
            typedef char (Base::*PFun)(int);
            PFun pFun = static_cast<PFun>(&Derive::Fun);
            return Proc(n, pFun);
        }
    };
    
    void main()
    {
        Base base;
        char bc = base.Fun2(83);
        cout << bc;
    
        Derive derive;
        char dc = derive.Fun2(83);
        cout << dc;
    }

    七、类成员函数指针——虚拟函数

    class Base
    {
    public:
        void OFun() { cout << "base ordinary" << endl; }
        virtual void VFun(int i) { cout << "base virtual" << endl; }
    };
    
    class Derive : public Base
    {
    public:
        void OFun() { cout << "derive ordinary" << endl; }
        virtual void VFun(int i) { cout << "derive virtual" << endl; }
    };
    
    void main()
    {
        typedef void (Base::*BaseOFun)();
        typedef void (Derive::*DeriveOFun)();
        BaseOFun baseOFun = &Base::OFun;
        DeriveOFun deriveOFun = static_cast<DeriveOFun>(baseOFun);
    
        typedef void (Base::*BaseVFun)(int);
        typedef void (Derive::*DeriveVFun)(int);
        BaseVFun baseVFun = &Base::VFun;
        DeriveVFun deriveFVun = static_cast<DeriveVFun>(baseVFun);
    
        Base base;
        (base.*baseOFun)();
        (base.*baseVFun)(1);
    
        Derive derive;
        (derive.*deriveOFun)();
        (derive.*deriveFVun)(1);
    }
  • 相关阅读:
    零点定理、介值定理
    古今数学史
    古今数学史
    StreamDM:基于Spark Streaming、支持在线学习的流式分析算法引擎
    StreamDM:基于Spark Streaming、支持在线学习的流式分析算法引擎
    随机化算法(二)
    随机化算法(二)
    机器学习算法时间复杂度的考虑
    机器学习算法时间复杂度的考虑
    matlab 工具函数、matlab toolbox(工具箱)
  • 原文地址:https://www.cnblogs.com/live41/p/3877737.html
Copyright © 2011-2022 走看看