控制隐藏的 vtordisp 构造函数/析构函数置换成员的添加。
vtordisp
pragma 是 C++ 专用的。
语法
#pragma vtordisp([push,] n)
#pragma vtordisp(pop)
#pragma vtordisp()
#pragma vtordisp([push,] {on|off})
参数
push
推送内部编译器堆栈上的当前 vtordisp 设置并将新 vtordisp 设置为 n。 如果未指定 n,则当前 设置保持不变vtordisp。
pop
从内部编译器堆栈中移除顶部的记录,并将 vtordisp 设置还原为已移除的值。
n
为 vtordisp 设置指定新值。 可能的值为 0、1 或 2,分别对应 /vd0、/vd1 和 /vd2 编译器选项。 有关详细信息,请参阅/vd(禁用构造置换)。
on
等效于 #pragma vtordisp(1)。
off
等效于 #pragma vtordisp(0)。
备注
vtordisp
pragma 仅适用于使用虚拟基的代码。 如果派生类重写它从虚拟基类继承的虚函数,并且派生类的构造函数或析构函数使用指向该虚拟基类的指针调用该函数,则编译器可能将其他隐藏的 vtordisp 字段引入具有虚拟基的类。
vtordisp
pragma 会影响其后面的类的布局。
/vd0、/vd1 和 /vd2 编译器选项为完整模块指定相同的行为。 指定 0 或 off 可取消显示隐藏的 vtordisp 成员。 仅当类的构造函数和析构函数调用由 vtordisp 指针指向的对象上的虚函数时才关闭 this。
指定 1 或 on(默认值)将在必要时启用隐藏的 vtordisp 成员。
指定 2 将为使用虚拟函数的所有虚拟基启用隐藏 vtordisp 成员。 要确保 #pragma vtordisp(2) 在部分构造的对象上正常运作,可能需要 dynamic_cast。 有关详细信息,请参阅编译器警告(1 级)C4436。
#pragma vtordisp()(没有参数)可将 vtordisp 设置还原到其初始设置。
#pragma vtordisp(push, 2)
class GetReal : virtual public VBase { ... };
#pragma vtordisp(pop)