指向会员代表的指针

Mir*_*pas 11 c++ member-function-pointers function-pointers

我试图从成员函数做一些回调,一切都很好,直到我尝试使用从2个类派生的模板类作为回调对象时,我得到以下错误:

error C2440: 'reinterpret_cast' : Pointers to members have different representations; cannot cast between them
Run Code Online (Sandbox Code Playgroud)

这件事告诉我,成员函数指针有不同的表示形式(doh!)

这些陈述是什么?他们之间有什么区别?

Alo*_*ave 18

Danny Kalev非常好地解释了这一点:

指向成员的指示

尽管指向成员的指针表现得像普通指针,但在幕后它们的表现形式却截然不同.事实上,指向成员的指针通常由一个结构组成,在某些情况下最多包含四个字段.这是因为指向成员的指针不仅要支持普通的成员函数,还要支持虚拟成员函数,具有多个基类的对象的成员函数以及虚基类的成员函数.因此,最简单的成员函数可以表示为一组两个指针:一个保存成员函数的物理内存地址,另一个指针保存this指针.但是,在虚拟成员函数,多继承和虚拟继承的情况下,指向成员的指针必须存储其他信息.因此,您不能将指向成员的指针转换为普通指针,也不能安全地在指向不同类型成员的指针之间进行转换.

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

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
Run Code Online (Sandbox Code Playgroud)

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

  • 我知道这是去年的雪,但上面的解释是不正确的。指向成员的指针不包含“this”。引用的作者似乎将成员指针与代表混淆了。买者自负。 (2认同)

Pet*_*ker 5

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