/** class_pointer.cxx**  Created on: 2012-9-15*      Author: Jesse Meng*/#include <iostream>
using namespace std;
class Base {
public:void foo1(void){cout<<"foo1"<<endl;}void foo2(void){cout<<"foo2被调用啦,mem2的值是"<<this->mem2<<"!"<<endl;}virtual void foo3(void){cout<<"foo3"<<endl;}virtual void foo4(void){cout<<"foo4"<<endl;}virtual void foo5(void){cout<<"foo5"<<endl;}Base(int i){cout<<"cons"<<endl;this->f=&Base::foo2;this->mem1=1.0;this->mem2=i;}~Base(){cout<<"des"<<endl;}double mem1;int mem2;void (Base::*f)(void);
};void test(){cout<<"test函数被调用啦!"<<endl;}
int main(int argc, char **argv) {//这个例子不涉及继承的情况啦!!!!!Base *b = new Base(1);Base *b2 = new Base(2);//声明的两个实例的位置cout<<"第一个实例的地址是: "<<b<<endl<<"第二个实例的地址是: "<<b2<<endl;//对成员取地址,&后加不加括号都一球样cout<<"第一个实例mem1成员的地址是: "<<&b->mem1<<endl<<"第一个实例mem2成员的地址是: "<<&b->mem2<<endl<<"第一个实例f成员的地址是: "<<&b->f<<endl;cout<<"第二个实例mem1成员的地址是: "<<&(b2->mem1)<<endl<<"第二个实例mem2成员的地址是: "<<&(b2->mem2)<<endl<<"第二个实例f成员的地址是: "<<&b2->f<<endl;//再看下函数的地址,下面的输出回事1\n1,这是不对滴//void (Base::*fad)(void)=&Base::foo1;cout<<"前面这个是错的"<<fad<<"| foo1的地址 "<<hex<<*(unsigned *)&fad<<endl;fad=&Base::foo2;cout<<"前面这个是错的"<<fad<<"| foo2的地址 "<<hex<<*(unsigned *)&fad<<endl;fad=&Base::foo3;cout<<"前面这个是错的"<<fad<<"| foo3的地址?! "<<hex<<*(unsigned *)&fad<<endl;fad=&Base::foo4;cout<<"前面这个是错的"<<fad<<"| foo4的地址?! "<<hex<<*(unsigned *)&fad<<endl;fad=&Base::foo5;cout<<"前面这个是错的"<<fad<<"| foo5的地址?! "<<hex<<*(unsigned *)&fad<<endl;cout<<"类中的函数指针演示-----------------------"<<endl;/*---------------下面来演示实例中的函数指针和类中方法是如何配合滴----------------------*///这是最普通的例子,木啥好说的void (*t) ( )=test;t();//回顾一下类中的函数指针    void (Base::*f)(void);(b->*b->f)();//下面的调用过程可以这样来理解//b2->f即通过b2获取实例中的函数指针,该指针指向类的方法//需要通过一个实例来触发,前面的b即此时的实例//所以此时输出的mem2的值为前面那个b中的值,即1(b->*b2->f)();(b2->*b->f)();(b2->*b2->f)();//前面的描述可以通过下面的代码来理解void (Base::*f2)(void)=NULL;f2=b2->f;(b->*f2)();cout<<"外部的函数指针演示-----------------------"<<endl;/*---------------下面来演示外部的函数指针和类中方法是如何配合滴----------------------*///foo1,foo2调用方法和前面的类似void (Base::*foo)(void) =&Base::foo1;(b->*foo)();cout<<"foo1的地址是: "<<hex<<(&Base::foo1)<<"    "<<*(unsigned *)&foo<<endl;foo=&Base::foo2;(b->*foo)();cout<<"foo2的地址是: "<<hex<<(&Base::foo2)<<"    "<<(unsigned *)&foo<<endl;//foo3,foo4的地址获取方法unsigned int offset=0;foo=&Base::foo3;offset=*(unsigned *)&foo;cout<<"foo3(虚)方法的偏移量(未修正) : "<<offset<<endl;//我也不清楚三个虚方法的偏移量为1,5,9?!!!!!//这里仅仅是修正一下offset/=4;//1/4//调用foo3方法(b->*foo)();//通过foo2来确定,用虚表加偏移地址然后调用的一致性void (Base::*foo2)(void)=0;//不带继承的情况下实例首地址存放虚表指针,可用"*(unsigned**)b+偏移量"的形式获取foo2=*((void (Base::**)(void))(*(unsigned**)b+ offset));cout<<"!!!!"<<endl;(b->*foo2)();cout<<"foo3的地址是: "<<hex<<*(unsigned *)&foo<<"    "<<*(unsigned**)b+offset<<endl;foo=&Base::foo4;offset=*(unsigned *)&foo;cout<<"foo4(虚)方法的偏移量(未修正) : "<<offset<<endl;offset/=4;//5/4(b->*foo)();cout<<*(unsigned *)&foo<<endl;foo2=*((void (Base::**)(void))(*(unsigned**)b+ offset));(b2->*foo2)();cout<<"foo4的地址是: "<<hex<<*(unsigned *)&foo<<"    "<<*(unsigned**)b2+offset<<endl;foo=&Base::foo5;offset=*(unsigned *)&foo;cout<<"foo5(虚)方法的偏移量(未修正) : "<<offset<<endl;offset/=4;//9/4(b->*foo)();cout<<*(unsigned *)&foo<<endl;foo2=*((void (Base::**)(void))(*(unsigned**)b+ offset));(b2->*foo2)();cout<<"foo5的地址是: "<<hex<<*(unsigned *)&foo<<"    "<<*(unsigned**)b2+offset<<endl;delete b;//b->~Base();delete b2;return 0;
}

C++中函数指针的运用相关推荐

  1. 关于C++中函数指针的使用(包含对typedef用法的讨论)

    关于C++中函数指针的使用(包含对typedef用法的讨论) (一)简单的函数指针的应用. //形式1:返回类型(*函数名)(参数表) char (*pFun)(int); char glFun(in ...

  2. C/C++中函数指针的含义(转)

                                 C/C++中函数指针的含义 函数存放在内存的代码区域内,它们同样有地址,我们如何能获得函数的地址呢?如果我们有一个int test(int a ...

  3. C++中函数指针数组的使用

    C++中函数指针数组的使用 来源:电脑教程在线(http://www.linuxdiyf.com/1/) 作者:linux 原文:C++中函数指针数组的使用(http://www.linuxdiyf. ...

  4. 关于C++中函数指针的使用

    关于C++中函数指针的使用(包含对typedef用法的讨论)  (一)简单的函数指针的应用. //形式1:返回类型(*函数名)(参数表)  char (*pFun)(int);  char glFun ...

  5. C++中函数指针的使用

    A function pointer is a variable that stores the address of a function that can later be called thro ...

  6. STC15分时内核中函数指针的使用问题

    2019独角兽企业重金招聘Python工程师标准>>> 基于前后台设计的系统随着功能的递增变得越来越难以维护, 所以决定为STC15F2K单片机编写一个基于时分的非抢占式内核,方便进 ...

  7. 【C/C 】浅谈C/C 中函数指针与回调函数

    01.函数指针 1.1.函数指针定义 一个函数总是占用一段连续的内存区域,函数名在表达式中有时也会被转换为该函数所在内存区域的首地址,这和数组名非常类似.我们可以把函数的这个首地址(或称入口地址)赋予 ...

  8. C中函数指针的基本语法和思想

    1.C语言中函数的调用可分为直接调用和间接调用(函数指针),具体调用方法如下: int add(int a,int b) { return a+b; } void main() { add(1,2); ...

  9. C++ 类中函数指针的使用

    文章目录 函数指针用法 类中的成员函数接收函数指针 情况1 情况2 情况3 总结 函数指针用法 函数指针可以作为一个函数的参数,传不同的函数指针给这个函数就可以让其实现不能的功能.从而我们可以复用这个 ...

最新文章

  1. print_r() 'ThinkPHP\Common\common.php 601
  2. Swift学习 OOP三大特性:继承、多态、封装
  3. android MotionEvent
  4. Cocos 2d-X Lua 游戏添加苹果内购(二) OC和Lua交互代码详解
  5. MYSQL timestamp NOT NULL插入NULL的报错问题
  6. [面向对象] ABAP中程序类如何转化成全局类
  7. 年度数据与月度数据转化_山东工会新媒体传播力指数2020年12月数据、年度数据出炉...
  8. 全志A33-修改linux kernel启动参数
  9. 解决笔记本重装问题(VISTA系统改为XP系统)
  10. python如何给定取值范围_python怎么限定函数自变量取值范围
  11. 为什么shell脚本第一行要#!/bin/sh
  12. [nginx报错]---unknown directive chunkin in /XXXXX/XXXXXX:XX的几种解决方式
  13. linux so文件统一目录,linux加载指定目录的so文件
  14. 第7章 SQL查询优化
  15. webbrowser控件 加载为空白_OA系统公文控件升级操作说明
  16. checkbox属性checked=checked已有,但却不显示打勾的解决办法
  17. iris数据集——决策树
  18. 系统架构——掌握和使用UML包图模型
  19. 计算机英语带字幕,计算机专业英语听力字幕.doc
  20. C++模板 —— 万字带你了解C++模板(蓝桥杯算法比赛必备知识STL基础)

热门文章

  1. NR 5G UE初始接入流程
  2. 2018-2019-1 20165201 《信息安全系统设计基础》第6周学习总结
  3. JavaScript随机生成颜色以及十六进制颜色 与RGB颜色值的相互转换
  4. kickstart+tftp部署redhat系统
  5. Enterprise Library 5.0发布
  6. .net中窗体之间的数据交换总结
  7. 内存对齐与sizeof
  8. App icon和启动图的尺寸需求(没有iPad)
  9. Java Lambda表达式入门
  10. WPF 自定义列表筛选 自定义TreeView模板 自定义ListBox模板