C++関数ポインタとクラスメンバー関数ポインタ

12072 ワード

一、関数ポインタ——基本形式
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);

}