C++ 指向类中虚函数的指针以及一个特殊指针的定义

zcdabing 2014-03-31 10:42:10
一个类,很简单的

class A

{

public:

A(){}

~A(){}

virtual void func(){}

void func2(){}

int _intn;

};

//main

void (A::*pfunc)()=&A::func;//虚函数

void (A::*pfunc2)()=&A::func2;//非静态成员函数

int A::*p_intn=&A::_intn;//成员变量

printf("%d\n",pfunc);

printf("%d\n",pfunc2);

printf("%d\n",p_intn);




问题:定义一个指向func的指针,如果输出指针值,应该是个偏移量才对,为什么却是个内存地址?



第二个问题是,如何定义指向析构函数的成员指针?
...全文
196 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
mujiok2003 2014-04-02
  • 打赏
  • 举报
回复
19L and 20L正解, 不可以取构造函数与析构函数的地址。 成员指针如何实现,是编译器的实现细节, 了解就好,不必深究。
unituniverse2 2014-04-02
  • 打赏
  • 举报
回复
至于构造函数: 12.1.10 No return type (not even void) shall be specified for a constructor. A return statement in the body of a constructor shall not specify a return value. The address of a constructor shall not be taken.
unituniverse2 2014-04-02
  • 打赏
  • 举报
回复
12.4.2 A destructor is used to destroy objects of its class type. A destructor takes no parameters, and no return type can be specified for it (not even void). The address of a destructor shall not be taken. A destructor shall not be static. ... 不允许取析构函数的地址,而且没有返回值(甚至连void都没有)
zcdabing 2014-04-01
  • 打赏
  • 举报
回复
引用 4 楼 xiaohuh421 的回复:
[quote=引用 3 楼 zcdabing 的回复:] inside the c++ object model里面的一节有介绍,取虚函数地址在编译期间未知,只能得到虚函数表的索引值
这里说的是" 编译期间 " 而你的程序中输出明显是在运行期, 而不是编译期. 析构函数也是函数, 可以这样访问. this->A::~A() . 取地址类似了.[/quote] 编译期间未知还不是因为没绑定具体对象啊?我这里都没产生具体对象,就是取下函数存放地址,跟编译期还是执行期没关系吧?
turing-complete 2014-04-01
  • 打赏
  • 举报
回复
又来一个“类似的”。 请问把析构函数当成无返回值的,怎么得到指向它的函数指针呢?
引用 12 楼 lm_whales 的回复:
构造函数比较麻烦,析构函数把他当成无返回值的函数,估计就成了。 析构函数是真的没有返回值 ,构造函数却不是。
zcdabing 2014-04-01
  • 打赏
  • 举报
回复
引用 8 楼 derekrose 的回复:
偏移量? 为什么这么说
第一次发帖版主就来了 我觉得那本书上没说清楚,书上说:取非静态成员函数的地址得到的是内存存放的地址,取虚函数的地址,因为执行期才知道是那个类中对应的虚函数,所以具体取虚函数的地址得到的会是索引值。 所以我是这么理解的,如果没有绑定到具体对象,应该得到索引值,绑定到具体对象的就应该是内存地址了,可是结果不是这样,没绑定对象得到的也是内存地址。
zcdabing 2014-04-01
  • 打赏
  • 举报
回复
引用 5 楼 mougaidong 的回复:
你类似一个在下看看呗? 我学学怎么写。 [quote=引用 4 楼 xiaohuh421 的回复:] [quote=引用 3 楼 zcdabing 的回复:] 析构函数也是函数, 可以这样访问. this->A::~A() . 取地址类似了.
[/quote] this 指针不是需要具体对象才可以使用嘛?如果直接取地址有没有类似 &A::func的方法?或者我这想法就不正确?
lm_whales 2014-04-01
  • 打赏
  • 举报
回复
原来析构函数不给看,我说怎么回事呢? 析构函数的地址不给取,所以就取不到,不能通过直接的方式取到。 和引用的实际 储存地址不给看,一个意思。
xiaohuh421 2014-04-01
  • 打赏
  • 举报
回复
引用 16 楼 zcdabing 的回复:
编译期间未知还不是因为没绑定具体对象啊?我这里都没产生具体对象,就是取下函数存放地址,跟编译期还是执行期没关系吧?
怎么会没有关系. 你的程序在运行时, 函数的代码肯定是会放到具体内存中, 那么这个地址肯定会是有一个"基址"存在的. 如果程序还没有运行, 那么这个基址就不存在, 那应该是一个0起的偏移,. 但是一但放入了内存中运行, 就存在基址了, 所以你得到的函数地址应该就是这个函数在内存中的入口地址了.
xiaohuh421 2014-03-31
  • 打赏
  • 举报
回复
引用 3 楼 zcdabing 的回复:
inside the c++ object model里面的一节有介绍,取虚函数地址在编译期间未知,只能得到虚函数表的索引值
这里说的是" 编译期间 " 而你的程序中输出明显是在运行期, 而不是编译期. 析构函数也是函数, 可以这样访问. this->A::~A() . 取地址类似了.
zcdabing 2014-03-31
  • 打赏
  • 举报
回复
引用 2 楼 mougaidong 的回复:
1. 应该是个偏移量?! 这个知识点是从哪儿学的? http://blog.csdn.net/mougaidong/article/details/6894563 2. http://stackoverflow.com/questions/10858998/how-do-i-get-the-member-function-pointer-of-a-destructor
inside the c++ object model里面的一节有介绍,取虚函数地址在编译期间未知,只能得到虚函数表的索引值
zcdabing 2014-03-31
  • 打赏
  • 举报
回复

补张图片
lm_whales 2014-03-31
  • 打赏
  • 举报
回复
构造函数比较麻烦,析构函数把他当成无返回值的函数,估计就成了。 析构函数是真的没有返回值 ,构造函数却不是。
turing-complete 2014-03-31
  • 打赏
  • 举报
回复
哦 原来是这样啊。 是类似吗? 我怎么感觉跟其他函数的做法大相径庭。
引用 10 楼 xiaohuh421 的回复:
忘记帖地址了: http://edu.21cn.com/ncre/g_51_754671-1.htm 百度搜索到的. 这里有实现的代码, 但没有通用性. 因为这个东西就不应该是标准的.
xiaohuh421 2014-03-31
  • 打赏
  • 举报
回复
忘记帖地址了: http://edu.21cn.com/ncre/g_51_754671-1.htm 百度搜索到的. 这里有实现的代码, 但没有通用性. 因为这个东西就不应该是标准的.
FancyMouse 2014-03-31
  • 打赏
  • 举报
回复
lz你先看看成员指针的sizeof是多少。这货没你想的那么简单的。
derekrose 2014-03-31
  • 打赏
  • 举报
回复
偏移量? 为什么这么说
turing-complete 2014-03-31
  • 打赏
  • 举报
回复
参考哪里? 哦,原来百度是个搜索引擎,你是用它来搜专业知识? 您就像楼主贴出的代码那样写个析构函数的呗,楼主的代码是
void (A::*pfunc)()=&A::func;//虚函数
 
void (A::*pfunc2)()=&A::func2;//非静态成员函数
引用 6 楼 xiaohuh421 的回复:
[quote=引用 5 楼 mougaidong 的回复:] 你类似一个在下看看呗? 我学学怎么写。
怎么类似法, 请参考这里. 百度一下都很多的. 因为类的析构函数, 本质上还是函数. 只是有些特殊罢了, 总有方法能获取其地址的.[/quote]
xiaohuh421 2014-03-31
  • 打赏
  • 举报
回复
引用 5 楼 mougaidong 的回复:
你类似一个在下看看呗? 我学学怎么写。
怎么类似法, 请参考这里. 百度一下都很多的. 因为类的析构函数, 本质上还是函数. 只是有些特殊罢了, 总有方法能获取其地址的.
加载更多回复(1)

64,654

社区成员

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

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