域作用解析运算符

scutth 2011-10-30 09:44:03

#include <iostream>
using namespace std;
class A
{
public:
virtual void f(){cout<<"A:f() is called."<<endl;}
};

class B:public A
{
public:
virtual void f(){cout<<"B:f() is called."<<endl;}
};

int main()
{
B b;
A &x = b;
void (A::*pf)()=&A::f;
(x.*pf)();
cout<<endl<<endl;
x.f();
return 0;
}


主函数中void (A::*pf)()=&A::F是什么意思,以及x.f()是怎么个用法。详细些哈。
...全文
193 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
iamnobody 2011-11-05
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 scutth 的回复:]
引用 3 楼 mingliang1212 的回复:

void (A::*pf)()=&amp;A::f;
这里其实是一个隐式转换。因为A::f是一个virtual函数。所以pf指向的不是A::f;的真实地址。而是指向了一个查找虚函数表,并调用相应的虚函数的小函数的地址。所以仍(x.*pf)();时,可以实现多态。

[/Quote]

pf是一个指向成员函数的地址,只能通过一个对象或者对象的指针和引用来调用。

参考下这个吧:

http://www.cnblogs.com/jans2002/archive/2006/10/13/528160.html
scutth 2011-10-31
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 mingliang1212 的回复:]

void (A::*pf)()=&A::f;
这里其实是一个隐式转换。因为A::f是一个virtual函数。所以pf指向的不是A::f;的真实地址。而是指向了一个查找虚函数表,并调用相应的虚函数的小函数的地址。所以仍(x.*pf)();时,可以实现多态。

但x.f()不行。
]]

从楼主的例子来看应该是研究这个的吧。。。如果不懂当我没来过。。。
[/Quote]

虚函数表的这个我知道,主要是
void (A::*pf)()=&A::f;
这个语法不清楚,以前没见到过,它的功能是什么
以及pf的作用/功能。
scutth 2011-10-31
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 relaxisland 的回复:]

这个是类成员指针的语法,要找本书看看才能清楚。

void (A::*pf)()=&A::F ---》定义了类A的成员指针, 它指向类A的f函数了。

x.f() 这个是普通的类函数调用方法啊。

(x.*pf)(); pf是前面定义的类成员函数指针,*pf就是他所指向的函数,也就是类的f函数,
因此,(x.*pf)(); ===== x.f()
[/Quote]
是想问(x.*pf)()来着。
有个疑问,如果void (A::*pf)()=&A::f是在定义一个类成员指针的话
那就是说可以在类外定义一个类的成员,这不符合类的封装性吧,而且也没听说
哪里有说过这个用法,C++ primer里也没找着。
iamnobody 2011-10-31
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 frankhb1989 的回复:]
引用 3 楼 mingliang1212 的回复:

void (A::*pf)()=&amp;A::f;
这里其实是一个隐式转换。因为A::f是一个virtual函数。所以pf指向的不是A::f;的真实地址。而是指向了一个查找虚函数表,并调用相应的虚函数的小函数的地址。所以仍(x.*pf)();时,可以实现多态。

但x.f()不行。
]]

从楼主的例子来看应该是研究这……
[/Quote]

刚刚没看到原来x是个引用。。。
FrankHB1989 2011-10-31
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 mingliang1212 的回复:]

void (A::*pf)()=&A::f;
这里其实是一个隐式转换。因为A::f是一个virtual函数。所以pf指向的不是A::f;的真实地址。而是指向了一个查找虚函数表,并调用相应的虚函数的小函数的地址。所以仍(x.*pf)();时,可以实现多态。

但x.f()不行。
]]

从楼主的例子来看应该是研究这个的吧。。。如果不懂当我没来过。。。
[/Quote]
x.f()不行?你确定没把x.A::f()和x.f()搞混?
iamnobody 2011-10-31
  • 打赏
  • 举报
回复
void (A::*pf)()=&A::f;
这里其实是一个隐式转换。因为A::f是一个virtual函数。所以pf指向的不是A::f;的真实地址。而是指向了一个查找虚函数表,并调用相应的虚函数的小函数的地址。所以仍(x.*pf)();时,可以实现多态。

但x.f()不行。
]]

从楼主的例子来看应该是研究这个的吧。。。如果不懂当我没来过。。。
iamnobody 2011-10-31
  • 打赏
  • 举报
回复
void (A::*pf)()=&A::f;
这里其实是一个隐式转换。因为A::f是一个virtual函数。所以pf指向的不是A::f;的真实地址。而是指向了一个查找虚函数表,并调用相应的虚函数的小函数的地址。所以仍(x.*pf)();时,可以实现多态。

但x.f()不行。
]]

从楼主的例子来看应该是研究这个的吧。。。如果不懂当我没来过。。。
relaxisland 2011-10-30
  • 打赏
  • 举报
回复
这个是类成员指针的语法,要找本书看看才能清楚。

void (A::*pf)()=&A::F ---》定义了类A的成员指针, 它指向类A的f函数了。

x.f() 这个是普通的类函数调用方法啊。

(x.*pf)(); pf是前面定义的类成员函数指针,*pf就是他所指向的函数,也就是类的f函数,
因此,(x.*pf)(); ===== x.f()

64,648

社区成员

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

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