如何输出类的非静态成员函数地址
来源:互联网 发布:自动整点报时软件 编辑:程序博客网 时间:2024/04/30 09:47
标签:c 类成员函数 地址 输出 from http://blog.sina.com.cn/s/blog_6f6c0f350100w3zf.html
#include <iostream>#include <stdio.h>using namespace std;class Ctest{public: static void statFunc() { cout << "statFunc" << endl; } void dynFunc() { cout << "dynFunc" << endl; } virtual void virtFunc() { cout << "virtFunc" << endl; }};void main(){ cout << "address of Ctest::statFunc:" << &Ctest::statFunc << endl; cout << "address of Ctest::dynFunc :" << &Ctest::dynFunc << endl; cout << "address of Ctest::virtFunc:" << &Ctest::virtFunc << endl; while(1);}
屏幕输出结果如下图所示:
从图中可以看出静态函数的地址显示正常,是一个32位地址值,但是动态函数和虚拟函数的地址都输出1,明显不是地址值。
从图中可以看书,通过使用printf输出,我们得到了动态函数的地址。那么对于虚拟函数,我们同样采用printf来输出,是不是就可以了呢,我们将cout << "address of Ctest::virtFunc:" << &Ctest::virtFunc << endl;
改为printf( "address of Ctest::virtFunc :X\n", &Ctest::virtFunc);运行的输出如下:
由上图可以看出同样可以得出一个准地址值。
为了验证取到的地址是否正确,我们可以分别定义三个成员函数指针来保存获得的函数地址,然后通过调用函数指针来看输出是否正确,就可以判断取到的地址是否正确了。以下是验证的代码:
#include <iostream>#include <stdio.h>using namespace std;class Ctest{public: static void statFunc() { cout << "statFunc" << endl; } void dynFunc() { cout << "dynFunc" << endl; } virtual void virtFunc() { cout << "virtFunc" << endl; }};void main(){ Ctest Object; Ctest* pObject = &Object; cout << "address of Ctest::statFunc:" << &Ctest::statFunc << endl; printf( "address of Ctest::dynFunc :X\n", &Ctest::dynFunc); printf( "address of Ctest::virtFunc:X\n", &Ctest::virtFunc); static void (*p_statFunc)(); void (Ctest::*p_dynFunc)();//注意非静态成员函数指针的定义需指明在那个类的域内 void (Ctest::*p_virtFunc)(); p_statFunc = &Ctest::statFunc; p_dynFunc = &Ctest::dynFunc; p_virtFunc = &Ctest::virtFunc; p_statFunc(); //非静态成员函数指针的调用也与普通函数不同,另外因为.*的优先级比()低,所以需要用括号把左边的操作 //数括起来,如果写成Object.*p_dynFunc();将无法通过编译 (Object.*p_dynFunc)(); (Object.*p_virtFunc)(); while(1);}
代码运行之后显示如下,从输出内容可见我们成功调用了对应的成员函数:
- 如何输出类的非静态成员函数地址
- 如何输出类的非静态成员函数地址
- 如何输出类的非静态成员函数地址
- 如何输出类的非静态成员函数地址
- 非静态成员函数地址
- 线程的静态函数如何访问类的非静态成员函数或成员变量
- 关于编译器对c++ 类静态成员、静态成员函数、非静态成员函数的处理
- 静态成员函数如何调用非静态成员变量
- 关于如何在一个类使用函数指针保存其子类的非静态成员函数
- 静态成员函数和非静态成员函数的区别?
- 静态成员函数和非静态成员函数的区别?
- 静态成员函数和非静态成员函数的区别
- 静态成员函数与非静态成员函数的区别
- 类的非静态成员函数作为线程函数
- 如何打印类成员函数的地址
- C++的静态成员函数访问非静态成员变量
- 回调函数中如何调用类中的非静态成员变量或非静态成员函数
- 类中的静态成员函数访问非静态成员变量
- Type mismatch: cannot convert from CharFragment to Fragment错误
- Mysql 视图
- ARM知识汇总
- JavaScript DOM学习(1)
- linux 定时任务
- 如何输出类的非静态成员函数地址
- Shiro实现验证码认证
- 基础整理02
- 怎样做C语言课程设计?(二)
- 在別人眼中別樣的幸福
- C++易错易混知识点
- Spring MVC与JAX-RS比较与分析
- arcgis数据类型
- Android Recovery 移植 Busybox