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

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. SciPy中两个模块:io 和misc

    读写.mat文件 如果你有一些数据,或者在网上下载到一些有趣的数据集,这些数据以Matlab的.mat 文件格式存储,那么可以使用scipy.io 模块进行读取. data = scipy.io.lo ...

  2. Problem M: 输出九九乘法表

    #include<stdio.h> int main() { int n,i,j; scanf("%d",&n); n>=&&n<= ...

  3. QEMU, a Fast and Portable Dynamic Translator

    AbstractWe present the internals of QEMU, a fast machine emulator using an original portable dynamic ...

  4. 位图(BitMap)索引

    前段时间听同事分享,偶尔讲起Oracle数据库的位图索引,顿时大感兴趣.说来惭愧,在这之前对位图索引一无所知,因此趁此机会写篇博文介绍下位图索引. 1. 案例 有张表名为table的表,由三列组成,分 ...

  5. Coherence对象压缩以及对象大小计算

    1.通过util.zip带的gzip压缩程序  Coherence对象压缩程序如下 package coherencetest; import com.tangosol.net.CacheFactor ...

  6. lsof/fuser卸载挂载文件

    Linux如何卸载挂载文件   在我们进行远程文件操作的时候,我们经常会出现文件服务出现卸载掉哦情况.例如 umount /mnt/net1umount: /mnt/net1: device is b ...

  7. ubuntu16.04给普通用戸提成root权限,会出现造成重启系统,没有登录用户

    一.导致问题的原因 直接修改配置文件提权,会造成重启系统后没有原来的登录用户 vim /etc/passwd nulige:x:0:0:nulige,,,:/home/gree:/bin/bash 解 ...

  8. IOS研究之多个UITextField的键盘处理

    在IOS开发中使用UITextField时常须要考虑的问题就是键盘的处理. 有时候,弹出的键盘会将UITextField区域覆盖,影响用户输入.这个时候就要将视图上移.这个时候我们须要考虑两点: 1, ...

  9. Java笔记9:Spring简单Demo

      1 下载spring-framework-3.0.5.RELEASE-with-docs.zip和spring-framework-3.0.5.RELEASE-dependencies.zip,放 ...

  10. RocketMQ之连接以及连接缓存

    发现rabbitmq有一个ConnectionFactory.发现rocketmq好像没这个东西.按道理来说如果每次发送消息都新建一条连接肯定是不可能的. ps:其实之所以是有上面的疑问是因为数据库连 ...