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);
    }
  • 相关阅读:
    ACM: Copying Data 线段树-成段更新-解题报告
    POJ 2488 A Knight's Journey
    POJ 3349 Snowflake Snow Snowflakes Hash
    POJ 2299 Ultra-QuickSort 归并排序、二叉排序树,求逆序数
    POJ 1035 Spell checker 简单字符串匹配
    POJ 3267 The Cow Lexicon 简单DP
    POJ 1459 Power Network 最大流(Edmonds_Karp算法)
    POJ 3687 Labeling Balls 逆向建图,拓扑排序
    HDU 1532 Drainage Ditches 最大流 (Edmonds_Karp)
    POJ 3026 Borg Maze bfs+Kruskal
  • 原文地址:https://www.cnblogs.com/live41/p/3877737.html
Copyright © 2011-2022 走看看