vtordisp
pragma
控制隐藏的 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
成员。 仅当类的构造函数和析构函数调用由 this
指针指向的对象上的虚函数时才关闭 vtordisp
。
指定 1
或 on
(默认值)将在必要时启用隐藏的 vtordisp
成员。
指定 2
将为使用虚拟函数的所有虚拟基启用隐藏 vtordisp
成员。 要确保 dynamic_cast
在部分构造的对象上正常运作,可能需要 #pragma vtordisp(2)
。 有关详细信息,请参阅编译器警告(1 级)C4436。
#pragma vtordisp()
(没有参数)可将 vtordisp
设置还原到其初始设置。
#pragma vtordisp(push, 2)
class GetReal : virtual public VBase { ... };
#pragma vtordisp(pop)