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);
    }
  • 相关阅读:
    调试cuda程序一定要细心啊 不然一个bug会折腾你2天
    XML和实体类之间相互转换(序列化和反序列化)
    C#实现实体类和XML相互转换
    C#压缩打包文件例子
    通过锁字符串达到控制并发的效果C#
    巧用Ajax的beforeSend 提高用户体验
    HTML代码在线运行工具
    .NET使用ZXing.NET生成中间带图片和不带图片的二维码
    获取电脑硬件信息 (硬盘,cpu,内存等)
    C# http请求带请求头部分
  • 原文地址:https://www.cnblogs.com/live41/p/3877737.html
Copyright © 2011-2022 走看看