64,281
社区成员
发帖
与我相关
我的任务
分享
struct Cls
{
char a;
char b;
char c;
void f(){cout <<"f()" <<endl;a++;}
void g(){cout <<"g()" <<endl;b++;}
void h(){cout <<"h()" <<endl;c++;}
void disp(){cout <<a <<b <<c <<endl <<endl;}
};
void call(Cls &obj, void (Cls::*func)())
{
(obj.*func)();
}
int main()
{
char Cls::*var_arr[]=
{
&Cls::a,
&Cls::b,
&Cls::c
};
void (Cls::*func_arr[])()=
{
&Cls::f,
&Cls::g,
&Cls::h,
&Cls::disp,
&Cls::h,
&Cls::g,
&Cls::f,
&Cls::disp
};
Cls x;
for(int i=0;i<sizeof var_arr/sizeof var_arr[0];++i)
x.*var_arr[i]='a'+i;
for(int i=0;i<sizeof func_arr / sizeof func_arr[0];++i)
call(x,func_arr[i]);
return 0;
}
class Base
{
int a;
public:
Base():a(0){};
virtual void fun(){
std::cout<<"Base::fun()"<<std::endl;
};
virtual void inc(){ a++;};
void showa(){std::cout<<a<<std::endl;};
} ;
class Derive: public Base
{
public:
void fun(){
std::cout<<"Derive::fun()"<<std::endl;
};
void inc(){ Base::inc();Base::inc();};
};
template <class Type>
void DoMemberFunction(Type** first,Type**last,void (Type::*pfun)()){
while(first != last)
((*first++)->*pfun)();
};
int main(){
Base a,b,c;
Derive e,f,g;
Base* arr[] = { &a,&e,&b,&f,&c,&g};
//其实下面三句都可以用库函数:std::for_each(arr,arr+6,std::mem_fun(&Base::inc));代替。分别在algorithm头文件和functional头文件
DoMemberFunction(arr,arr+6,&Base::fun);//一般更多地用来访问函数成员,而不是数据成员。多态调用。
DoMemberFunction(arr,arr+6,&Base::inc);
DoMemberFunction(arr,arr+6,&Base::showa);//这是连接泛型编程和面向对象的桥梁。
system("pause");
return 0;
}