标签: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);
}
代码运行之后显示如下,从输出内容可见我们成功调用了对应的成员函数: