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

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. Java高级架构师(一)第19节:X-gen生成相应的Visitor

    package cn.javass.themes.smvcsm.visitors; import cn.javass.xgen.genconf.vo.ExtendConfModel; import c ...

  2. Asp.Net MVC part2 View、Controller详解

    View详解Razor视图引擎简介HtmlHelper强类型页面 Razor视图引擎简介强大的@:表示使用C#代码,相当于aspx中的<%%>可以完成输出功能当遇到html标签时会认为C# ...

  3. 测试网站页面网速的Python脚本

    一.测试网站页面网速脚本 [root@salt ~]# cat check_url.py #!/usr/bin/python # coding: UTF-8 import StringIO,pycur ...

  4. OpenGL ES 3.0之Fragment buffer objects(FBO)详解 (转)

    http://www.cnblogs.com/salam/p/4957250.html 片段操作图 这篇文章将介绍从写入帧缓冲和读取帧缓冲的方式. Buffers(缓冲) OpenGL ES支持三种缓 ...

  5. Redis 命令一

    Redis 命令用于在 redis 服务上执行操作. 要在 redis 服务上执行命令需要一个 redis 客户端.Redis 客户端在我们之前下载的的 redis 的安装包中. 1.Redis 客户 ...

  6. 如何在不重启或重新格式化hadoop集群的情况下删除集群节点

    在master节点上的hadoop安装目录下 进入conf目录 配置hdfs-site.xml文件 添加节点如下: <property> <name>dfs.hosts.exc ...

  7. observer pattern 之我见

    所谓模式,更多的是一种想法,完全没必要拘泥于代码细节.观察者模式更多体现了两个独立的类利用接口完成一件本应该很复杂的事情 --------------------------------------- ...

  8. win10系统怎样手动安装cab更新补丁

    win10系统怎样手动安装cab更新补丁 1. 把所有补丁放进一个文件夹 例如 C:\UPDATE2. 以管理员运行命令提示符 3. 输入以下命令後按 Enterdism /online /add-p ...

  9. redis源代码分析(5)——aof

    前面几篇基本介绍了redis的主要功能.流程.接下来是一些相对独立的部分,首先看一下持久化. redis持久化支持两种方式:RDB和AOF,我们首先看一下AOF的实现. AOF(Append only ...

  10. pngCanvas 是一个使用纯Python代码的生成png图像的工具

    #!/usr/bin/env python """Simple PNG Canvas for Python - updated for bytearray()" ...