首先我们定义一个类Ctest,类里面包含三个不同形式的成员函数,静态成员函数statFunc()、动态成员函数dynFunc()和虚拟函数virtFunc()。在main函数中我们利用cout标准输出流分别输出这三个函数的地址,程序如下所示:
#include <iostream>
#include <stdio.h>
using namespace std;
class Point
{
public:
virtual ~Point();
float x(){return 0.1;};
float y(){return 0.2;};
static void add(){cout<<&Point::x<<endl;}
virtual float z();
};
int main()
{
cout<<&Point::x<<endl;
cout<<&Point::y<<endl;
cout<<&Point::add<<endl;
cout<<&Point::z<<endl;
while(1);
return 0;
}
屏幕输出结果如下图所示:
从图中可以看出静态函数的地址显示正常,是一个32位地址值,但是动态函数和虚拟函数的地址都输出1,明显不是地址值。
从图中可以看书,通过使用printf输出,我们得到了动态函数的地址。那么对于虚拟函数,我们同样采用printf来输出,也可以得到其准确地址。
为了验证取到的地址是否正确,我们可以分别定义三个成员函数指针来保存获得的函数地址,然后通过调用函数指针来看输出是否正确,就可以判断取到的地址是否正确了。以下是验证的代码:
class Point
{
public:
void x(){cout<<"dyn::x"<<endl;};
static void add(){cout<<"static::add"<<endl;}
virtual void z(){cout<<"vir::z"<<endl;}
};
int main()
{
Point po;
Point *pt=&po;
cout<<&Point::x<<endl;
cout<<&Point::add<<endl;
cout<<&Point::z<<endl;
printf( "address of Point::x %p\n", &Point::x);
printf( "address of Point::add %p\n", &Point::add);
printf( "address of Point::z %p\n", &Point::z);
void (Point::*p_dyn)();//注意非静态成员函数指针的定义需指明在那个类的域内
void (*p_stat)();
void (Point::*p_vir)();
p_dyn=&Point::x;
p_stat=&Point::add;
p_vir=&Point::z;
p_stat();
(po.*p_dyn)();
(po.*p_vir)();
while(1);
return 0;
}
代码运行之后显示如下,从输出内容可见我们成功调用了对应的成员函数: