请解释void (A::*fun)(); fun=&A::fun; 和 (p->*fun)();

Shawn.Hu 2010-09-05 11:07:17
请重点解释下段程序中void (A::*fun)(); fun=&A::fun; 和 (p->*fun)()的语法和意义:


#include<iostream>

using namespace std;

class A{
public:
virtual void fun(){ cout<<"A::fun"<<endl;}
virtual void fun2(){cout<<"A::fun2"<<endl;}
};

class B:public A
{
public:
void fun(){ cout<<"B::fun"<<endl;}
void fun2(){ cout<<"B::fun2"<<endl;}
};

void main()
{
void (A::*fun)();
A *p=new B;
fun=&A::fun;
(p->*fun)();
fun = &A::fun2;
(p->*fun)();
delete p;
system("pause");
}
...全文
343 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
昵称很不好取 2010-09-06
  • 打赏
  • 举报
回复
google 成员函数指针
luzhiwei512 2010-09-06
  • 打赏
  • 举报
回复
void (A::*fun)();这个声明应该可以理解,main局部 fun是指向void(A::)()的指针
fun=&A::fun;
(p->*fun)() ->*成员指针选择符号,->*优先级低于括号。调用函数是函数名加参数

然后的问题 B的成员函数fun fun2都是继承A的虚函数,省略了virtual,所以这个问题是虚函数的特性,可以看下虚函数相关知识

harderman 2010-09-06
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 dingshaofengbinbin 的回复:]
C/C++ code

void (A::*fun)();//声明一个函数指针,同时声明了作用域。
A *p=new B;
fun=&A::fun;//把A中的fun函数的入口地址赋给函数指针,也可以把&去掉。
(p->*fun)();//其实这句话就跳到了A的fun函数去执行,加个p是指明这个函数的环境p,也就是这个函数的this指针是指向p的,如果不加p的话,里面很有……
[/Quote]
+1
look_back 2010-09-06
  • 打赏
  • 举报
回复
其实就是多态问题,即使这样赋值地址,还是一样调用B的function
dingshaofengbinbin 2010-09-06
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 dingshaofengbinbin 的回复:]
C/C++ code

void (A::*fun)();//声明一个函数指针,同时声明了作用域。
A *p=new B;
fun=&A::fun;//把A中的fun函数的入口地址赋给函数指针,也可以把&去掉。
(p->*fun)();//其实这句话就跳到了A的fun函数去执行,加个p是指明这个函数的环境p,也就是这个函数的this指针是指向p的,如果不加p的话,里面很有……
[/Quote]
是的,我这说的是有点问题(其实这句话就跳到了A的fun函数去执行)。。。。。。
dingshaofengbinbin 2010-09-06
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 hitrose27 的回复:]
A *p=new B;
这一行代码是产生多态的原因,因此输出的是B::fun和B::fun2!
[/Quote]
我有没说输出的是A::fun和A::fun2!,我写的代码输出的不是B::fun和B::fun2!吗?看来你对多态也只是皮毛啊!!!!
maoxing63570 2010-09-06
  • 打赏
  • 举报
回复
http://blog.csdn.net/hairetz/archive/2009/05/06/4153252.aspx不要你google了,这里有个现成的
hitrose27 2010-09-06
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 dingshaofengbinbin 的回复:]

引用 1 楼 dingshaofengbinbin 的回复:
C/C++ code

void (A::*fun)();//声明一个函数指针,同时声明了作用域。
A *p=new B;
fun=&amp;A::fun;//把A中的fun函数的入口地址赋给函数指针,也可以把&amp;去掉。
(p->*fun)();//其实这句话就跳到了A的fun函数去执行,加个p是指明……
[/Quote]
呵呵,共同进步而已~
ForestDB 2010-09-06
  • 打赏
  • 举报
回复
成员函数指针。
hitrose27 2010-09-05
  • 打赏
  • 举报
回复
A *p=new B;
这一行代码是产生多态的原因,因此输出的是B::fun和B::fun2!
hitrose27 2010-09-05
  • 打赏
  • 举报
回复
LS说的不完整吧?
这个还要考虑继承的问题,p不是应该还有多态性么?

A中的函数声明为virtual,那么调用的应该为B中的函数吧?
dingshaofengbinbin 2010-09-05
  • 打赏
  • 举报
回复

void (A::*fun)();//声明一个函数指针,同时声明了作用域。
A *p=new B;
fun=&A::fun;//把A中的fun函数的入口地址赋给函数指针,也可以把&去掉。
(p->*fun)();//其实这句话就跳到了A的fun函数去执行,加个p是指明这个函数的环境p,也就是这个函数的this指针是指向p的,如果不加p的话,里面很有可能会用到A的一些私有变量,这些私有变量都不知道指向哪了。所以这个p是一定要加的。
fun = &A::fun2;//下面就不用多解释了吧。
(p->*fun)();
delete p;
system("pause");

相当于如下代码:

A *p=new B;
p->fun();
p->fun2();
delete p;
system("pause");

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧