C++ 指向成员表示的指针

C++ 指向成员表示的指针,c++,function-pointers,member-function-pointers,C++,Function Pointers,Member Function Pointers,我正在尝试从成员函数进行一些回调,但一切正常,直到我尝试使用从2个类派生的模板类作为回调对象时,出现以下错误: error C2440: 'reinterpret_cast' : Pointers to members have different representations; cannot cast between them 这件事告诉我成员函数指针有不同的表示(doh!) 这些表述是什么?它们之间有什么区别 指向成员的指针的基本表示形式 尽管指向成员的指针的行为与普通指针类似,但在幕后

我正在尝试从成员函数进行一些回调,但一切正常,直到我尝试使用从2个类派生的模板类作为回调对象时,出现以下错误:

error C2440: 'reinterpret_cast' : Pointers to members have different representations; cannot cast between them
这件事告诉我成员函数指针有不同的表示(doh!)

这些表述是什么?它们之间有什么区别

指向成员的指针的基本表示形式

尽管指向成员的指针的行为与普通指针类似,但在幕后,它们的表示方式却大不相同。事实上,在某些情况下,指向成员的指针通常由最多包含四个字段的结构组成。这是因为指向成员的指针不仅必须支持普通成员函数,还必须支持虚拟成员函数、具有多个基类的对象的成员函数以及虚拟基类的成员函数。因此,最简单的成员函数可以表示为一组两个指针:一个指针保存成员函数的物理内存地址,另一个指针保存
指针。但是,在类似于虚拟成员函数、多重继承和虚拟继承的情况下,指向成员的指针必须存储附加信息。因此,您不能将指向成员的指针强制转换为普通指针,也不能在指向不同类型成员的指针之间安全地强制转换

要了解编译器如何表示指向成员的指针,请使用
sizeof
运算符。在下面的示例中,采用指向数据成员的指针和指向成员函数的指针的大小。如您所见,它们具有不同的大小,因此具有不同的表示:

请注意,这些指针中的每一个都可能有不同的表示形式,这取决于所讨论的类以及成员函数是否是虚拟的


这是微软的事情:在某些情况下,它们使指向成员函数的指针变小,但代价是生成指向具有不同表示形式的成员函数的指针,正如您刚才所看到的。有一个开关可以关闭它(),这样所有指向成员的指针都有相同的表示形式。

你可能想看看
std::bind
,它可以绑定成员函数和对象,还有
std::function
,它可以存储结果回调。@MSalters我只是做了一些测试来向上转换一些东西(不安全,我知道-但它们是测试)。
std::function
是一种方法。有关类似的讨论和编译器开关的链接,请参阅。有关
/vmb
/vmg
编译器开关的效果,请参阅。
struct A
{
 int x;
 void f();
};
int A::*pmi = &A::x;
void (A::*pmf)() = &A::f;
int n = sizeof (pmi); // 8 byte with my compiler
int m = sizeof (pmf); // 12 bytes with my compiler