我想获取一个c++类的成员函数的地址,将其存储在一个指针中,并在以后调用虚函数。
我知道一些关于它的事情,但现在不知道如何获取虚拟函数的某个实现的地址,该虚拟函数不是最后代类(对象的实际类)的实现。
下面是一些示例代码:
#include <iostream>
using namespace std;
class ca
{
public:
virtual void vfunc() {cout << "a::vfunc ";}
void mfunc() {cout << "a::mfunc ";}
};
class cb : public ca
{
public:
virtual void vfunc() {cout << "b::vfunc ";}
};
extern "C" int main(int, char **)
{
void (ca:: *ptr_to_vfunc)() = &ca::vfunc;
cout << sizeof(ptr_to_vfunc) << " ";
cb b;
(b.*ptr_to_vfunc)();
ca a;
(a.*ptr_to_vfunc)();
void (ca:: *ptr_to_mfunc)() = &ca::mfunc;
cout << sizeof(ptr_to_mfunc) << " ";
(a.*ptr_to_mfunc)();
}
输出为:
12 B::自愿基金a::自愿基金12 a::多国基金
我使用的是win32环境,成员函数指针的大小是3 * 32位值!当我获取成员函数的地址时,我没有指定一个对象,但是,我的调用调用了vfunc()的最后代类的实现。
1)这里发生了什么?为什么是12字节而不是4字节?2)我如何获取ca::vfunc()的地址并在b上调用它,就像我通常对b.ca::vfunc()所做的那样。
1条答案
按热度按时间blmhpbnm1#
好的:它正在做它应该做的事情。
但我想回答你的问题
1)这是怎么回事?为什么是12字节而不是4字节?
为什么不呢?
该标准未规定尺寸。
我不知道为什么你期望一个正常的指针是4。
如果问题是“为什么方法指针比普通指针大?”
因为实现需要额外的空间来保存有关调用的信息。
2)我如何获取ca::vfunc()的地址并在B上调用它,就像我通常对b.ca::vfunc()所做的那样。
你不能。