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

  1. char Fun(int n) { return char(n); }
  2. //char(*pFun)(int);
  3.  
  4. void main()
  5. {
  6. char(*pFun)(int);
  7. pFun = Fun;
  8. char c = (*pFun)();
  9. cout << c;
  10. }

二、函数指针——typedef形式

  1. char Fun(int n) { return char(n); }
  2. //typedef char(*PFun)(int);
  3. //PFun pFun;
  4.  
  5. void main()
  6. {
  7. typedef char(*PFun)(int);
  8. PFun pFun;
  9. pFun = Fun;
  10. char c = (*pFun)();
  11. cout << c;
  12. }

三、类成员函数指针

  1. class Base
  2. {
  3. public:
  4. char Fun(int n) { return char(n); }
  5. };
  6.  
  7. //typedef char (Base::*PFun)(int);
  8. //PFun pFun;
  9.  
  10. void main()
  11. {
  12. typedef char (Base::*PFun)(int);
  13. PFun pFun;
  14. pFun = &Base::Fun;
  15. Base instance;
  16. char c = (instance.*pFun)();
  17. cout << c;
  18. }

四、类成员函数指针——类指针

  1. class Base
  2. {
  3. public:
  4. char Fun(int n) { return char(n); }
  5. };
  6.  
  7. //typedef char (Base::*PFun)(int);
  8. //PFun pFun;
  9.  
  10. void main()
  11. {
  12. typedef char (Base::*PFun)(int);
  13. PFun pFun;
  14. pFun = &Base::Fun;
  15. Base *pInstance = new Base();
  16. char c = (pInstance->*pFun)();
  17. delete pInstance;
  18. cout << c;
  19. }

五、类成员函数指针——内部调用(this->*)

  1. class Base
  2. {
  3. public:
  4. char Fun(int n) { return char(n); }
  5. char Fun2()
  6. {
  7. char (Base::*pFun)(int);
  8. pFun = &Base::Fun;
  9. char c = (this->*pFun)();
  10. return c;
  11. }
  12. };
  13.  
  14. void main()
  15. {
  16. Base instance;
  17. char c = instance.Fun2();
  18. cout << c;
  19. }

六、类成员函数指针——继承调用

  1. class Base
  2. {
  3. public:
  4. char Fun(int n) { return char(n); }
  5.  
  6. char Fun2(int n)
  7. {
  8. //char (Base::*pFun)(int);
  9. //pFun = &Base::Fun;
  10. typedef char (Base::*PFun)(int);
  11. PFun pFun = &Base::Fun;
  12. return Proc(n, pFun);
  13. }
  14.  
  15. char Proc(int n, char(Base::*pFun)(int))
  16. {
  17. return (this->*pFun)(n);
  18. }
  19. };
  20.  
  21. class Derive : Base
  22. {
  23. public:
  24. char Fun(int n) { return char(n - ); }
  25.  
  26. char Fun2(int n)
  27. {
  28. typedef char (Base::*PFun)(int);
  29. PFun pFun = static_cast<PFun>(&Derive::Fun);
  30. return Proc(n, pFun);
  31. }
  32. };
  33.  
  34. void main()
  35. {
  36. Base base;
  37. char bc = base.Fun2();
  38. cout << bc;
  39.  
  40. Derive derive;
  41. char dc = derive.Fun2();
  42. cout << dc;
  43. }

七、类成员函数指针——虚拟函数

  1. class Base
  2. {
  3. public:
  4. void OFun() { cout << "base ordinary" << endl; }
  5. virtual void VFun(int i) { cout << "base virtual" << endl; }
  6. };
  7.  
  8. class Derive : public Base
  9. {
  10. public:
  11. void OFun() { cout << "derive ordinary" << endl; }
  12. virtual void VFun(int i) { cout << "derive virtual" << endl; }
  13. };
  14.  
  15. void main()
  16. {
  17. typedef void (Base::*BaseOFun)();
  18. typedef void (Derive::*DeriveOFun)();
  19. BaseOFun baseOFun = &Base::OFun;
  20. DeriveOFun deriveOFun = static_cast<DeriveOFun>(baseOFun);
  21.  
  22. typedef void (Base::*BaseVFun)(int);
  23. typedef void (Derive::*DeriveVFun)(int);
  24. BaseVFun baseVFun = &Base::VFun;
  25. DeriveVFun deriveFVun = static_cast<DeriveVFun>(baseVFun);
  26.  
  27. Base base;
  28. (base.*baseOFun)();
  29. (base.*baseVFun)();
  30.  
  31. Derive derive;
  32. (derive.*deriveOFun)();
  33. (derive.*deriveFVun)();
  34. }

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. Saga的实现模式——控制者(Saga implementation patterns – Controller)

    https://lostechies.com/jimmybogard/2013/03/14/saga-implementation-patterns-controller/ 之前的文章中我们介绍了观察 ...

  2. D3.js系列——初步使用、选择元素与绑定数据

    D3 的全称是(Data-Driven Documents),顾名思义可以知道是一个被数据驱动的文档.听名字有点抽象,说简单一点,其实就是一个 JavaScript 的函数库,使用它主要是用来做数据可 ...

  3. Linux源码编译安装MySQL5.7

    目录[-] 一.环境准备: 二.升级系统: 三.做一些准备工作(以下Linux命令均在su到root用户操作): 四.开始编译安装mysql-5.7.9: 一.环境准备: 我尝试过以下环境都是能成功的 ...

  4. 手写一个死锁Demo

    相互持有对方锁,导致死锁 package jesse.test04; public class DeadLockSample extends Thread{ private String first; ...

  5. C#文本框中默认是不允许使用全选的

    C#文本框中默认是不允许使用全选的.可以通过以下事件完成:  private void textBox1_KeyDown(object sender, KeyEventArgs e) {      i ...

  6. 初识FASTBuild 一个大幅提升C/C++项目编译速度的分布式编译工具

    FASTBuild 是一款高性能.开源的构建系统,支持高度可扩展的编译,缓存和网络分发. 以上是FASTBuild官网对其产品的一句话介绍. FASTBuild 的开源地址:https://githu ...

  7. ffmpeg 复用

    aa 将mkv中的音视频复用成ts流: ffmpeg -i 32_mkv_h264_718x480_ac3.mkv  -codec copy -bsf:v h264_mp4toannexb  -f m ...

  8. Python学习笔记(四)多进程的使用

    python中多进程与Linux 下的C基本相同.   fork的基本使用   先看最简单的例子: # coding: utf-8 import os def my_fork(): pid = os. ...

  9. <转>C++位运算详解

    原文转自:http://www.crazycpp.com/?p=82 前言 以前收藏过一篇讲C++位操作的文章,这次博客搬家,以前的数据都没有保留,整理谷歌网站管理后台的时候,发现不时的还有网友有在查 ...

  10. PHP,mysql,Linux,CI框架学习总结

    PHP,mysql,CI框架学习总结 PHP标记 1.Xml风格<?php ?> 2.简短风格 <? ?> 需在php.ini中开启short_open_tag 3.asp风格 ...