指向成员表示的指针
Pointers to members representations
我正在尝试从成员函数进行一些回调,一切都很好,直到我尝试使用从两个类派生的模板类作为回调对象时,我得到了以下错误:
error C2440: 'reinterpret_cast' : Pointers to members have different representations; cannot cast between them
这件事告诉我,成员函数指针有不同的表示形式(doh!)
这些表述是什么?它们之间有什么区别?
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
注意,根据所讨论的类以及成员函数是否是虚拟的,这些指针中的每一个都可能有不同的表示形式。
这是微软的一件事:在某些情况下,他们会缩小指向成员函数的指针,代价是生成指向具有不同表示形式的成员函数的指示器,正如您刚才看到的那样。有一个开关可以关闭它(/vmg
),这样所有指向成员的指针都有相同的表示形式。
相关文章:
- 数组指针表示法C++(移动数组时)
- 使用指针计算堆栈问题的大 O 表示法
- 使用 int 指针的浮点数的位表示形式
- 传递给放置 new 的指针是否是指向其对象表示形式的非 UB 指针?
- C++指针表示法
- char p[0]表示自动分配的缓冲区还是安全指针
- 如何以指针格式表示多维数组?
- 如何将升压数组表示为类型的指针?
- C 中的动态数组(用指针表示) - 输入元素
- 在 C 和指针表示法中放置星号的位置C++
- 如何在指针表示法和数组表示法中循环遍历二维数组
- 使用指针表示法在数组中循环
- 将引用转换为 C++ 中的指针表示形式
- 使用指针表示堆栈
- 尝试在此测试分数程序上使用指针表示法而不是数组表示法,但我被困住了
- 如何在c++中将指针表示的2D数组转换回2D数组
- 使用指针表示法从矩阵中读取数据
- 使用指针表示法反转cstring时出现意外结果
- 我可以用指针表示多维数组吗?
- 使用指针表示法访问结构数组