C++関数ポインタとクラスメンバー関数ポインタ
12072 ワード
一、関数ポインタ——基本形式
二、関数ポインタ——typedef形式
三、クラスメンバー関数ポインタ
四、クラスメンバー関数ポインタ——クラスポインタ
五、クラスメンバー関数ポインタ——内部呼び出し(this->*)
六、クラスメンバー関数のポインタ——呼び出しを継承する
七、クラスメンバー関数ポインタ——仮想関数
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);
}