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

char Fun(int n) { return char(n); }
//char(*pFun)(int); void main()
{
char(*pFun)(int);
pFun = Fun;
char c = (*pFun)();
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)();
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)();
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)();
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)();
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 - ); } 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();
cout << bc; Derive derive;
char dc = derive.Fun2();
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)(); Derive derive;
(derive.*deriveOFun)();
(derive.*deriveFVun)();
}

C++函数指针和类成员函数指针的更多相关文章

  1. C++函数指针相关 & 类成员的指针 & 成员函数的指针

    有时候会有指向类成员变量或者成员函数的指针,但是注意,这个指针并不是针对一个地址的指向,而更多的是一个偏移. 同时,支持将父类对象的成员 转为 子类对象的成员指针,如下: 反过来,是不行的.因为父类的 ...

  2. 深入理解类成员函数的调用规则(理解成员函数的内存为什么不会反映在sizeof运算符上、类的静态绑定与动态绑定、虚函数表)

    本文转载自:http://blog.51cto.com/9291927/2148695 总结: 一.成员函数的内存为什么不会反映在sizeof运算符上?             成员函数可以被看作是类 ...

  3. mfc 类成员函数

    知识点 类成员变量初值 类的构造函数 类成员函数 类成员函数的位置 一.类成员变量初值 二.类的构造函数 构造函数 是一种特殊的方法,主要用来在创建对象时初始化对象,即为对象成员变量赋初始值. 构造函 ...

  4. C++的类成员和类成员函数指针

    类成员函数指针: 用于访问类成员函数,和一般函数指针有区别. 类成员函数处理的是类数据成员,声明类成员函数指针的同时,还要指出具体是哪个类的函数指针才可以.调用时也要通过对象调用. 而对于类的静态成员 ...

  5. C/C++ 类成员函数指针 类成员数据指针

    普通函数指针:  "return_type (*ptr_name)(para_types) " 类成员函数指针: "return_type (class_name::*p ...

  6. C++ 面向对象 类成员函数this指针

    每个类成员函数都只涉及一个对象, 即调用它的对象. 但有时候方法可能涉及到两个对象, 在这种情况下需要使用C++ 的 this 指针 假设将方法命名为topval(), 则函数调用stock1.top ...

  7. 类成员函数指针的特殊之处(成员函数指针不是指针,内含一个结构体,需要存储更多的信息才能知道自己是否virtual函数)

    下面讨论的都是类的非静态成员函数. 类成员函数指针的声明及调用: 1 2 3 4 5 6 7 //pr是指向Base类里的非静态成员函数的指针 //其行参为(int, int),返回值为void vo ...

  8. this指针和const成员函数

    1.this指针 1)this指针是成员函数的隐式参数,成员函数通过this指针来访问调用它自己的那个对象,成员函数对各成员的访问均通过this进行 2)当某个对象调用它的成员函数时,编译器会把这个对 ...

  9. 类成员函数作为pthread_create函数参数

    from:http://www.cnblogs.com/shijingxiang/articles/5389294.html 近日需要将线程池封装成C++类,类名为Threadpool.在类的成员函数 ...

随机推荐

  1. 1.2(学习笔记) JSP动作元素

    动作元素 jsp:useBean:根据指定类实例化一个对象,类似Preson per = new Preson(); <jsp:useBean id="对象名" class ...

  2. STL之priority_queue3

    描述 使用STL中的优先队列,将n个点按照横坐标从小到大顺序排序,如果横坐标相同,按照纵坐标从小到大排序. 部分代码已经给出,请补充完整,提交时请勿包含已经给出的代码. int main() { in ...

  3. 微信小程序API·目录

    网络 媒体 文件 数据缓存 位置 设备 界面 第三方平台 开放接口 数据 更新 多线程 监控 调试接口 日志

  4. URL Schemes(转载)

    URL Schemes 应用在 iOS 上已经很久了.对于使用者来说,在沙盒机制下的 iOS 中,如果想做到一定程度上的自动化就不可避免地要用到 URL Schemes.但因为 URL Schemes ...

  5. Spring.NET的中间数据层(Middle Tier Data Access)——事务管理(Transaction management)

    简介 Spring.NET为事务管理提供了一个持久化抽象(consistent abstraction ),其优点如下: 为不同事务API,例如ADO.NET,Enterprise Services, ...

  6. 【重装系统】老毛桃U盘工具V2013超级装机版-安装原版Win7/Win8

    老毛桃U盘工具V2013超级装机版-程序下载和运行 老毛桃U盘工具V2013超级装机版-安装原版XP的方法 老毛桃U盘工具V2013超级装机版-安装原版Win7/Win8

  7. 上手 Webpack ? 这篇就够了!

    JavaSript 模块化打包已混迹江湖许久.2009年,RequireJS 就提交了它的第一个版本,Browserify 接踵而至,随后其他打包工具也开始大行其道.最终,Webpack 从其中脱颖而 ...

  8. JavaScript之链式结构序列化1

    一.概述 在JavaScript中,链式模式代码,太多太多,如下: if_else: if(...){ //TODO }else if(...){ //TODO }else{ //TODO } swi ...

  9. python之pack布局

    #Pack为一布局管理器,可将它视为一个弹性的容器 '''1.一个空的widget'''#不使用pack # -*- coding: cp936 -*- from Tkinter imp ort * ...

  10. VR虚拟现实的工作原理,你知道多少?【转】

    VR虚拟现实经过几年的预热,已经开始呈现爆发式增长,要了解VR虚拟现实,就需要了解其工作原理,了解工作原理之前,我们就需要弄清楚眼睛是如何看清事物的. 眼睛瞳孔后有晶状体,也就是眼珠子.眼睛的背面有感 ...