vtordisp解释
官方参考
https://docs.microsoft.com/en-us/cpp/preprocessor/vtordisp?view=vs-2019
The vtordisp pragma is applicable only to code that uses virtual bases. If a derived class overrides a virtual function that it inherits from a virtual base class, and if a constructor or destructor for the derived class calls that function using a pointer to the virtual base class, the compiler might introduce additional hidden
vtordisp
fields into classes with virtual bases.The vtordisp pragma affects the layout of classes that follow it. The
/vd0
,/vd1
, and/vd2
options specify the same behavior for complete modules. Specifying 0 or off suppresses the hiddenvtordisp
members. Turn off vtordisp only if there's no possibility that the class's constructors and destructors call virtual functions on the object pointed to by thethis
pointer.Specifying 1 or on, the default, enables the hidden
vtordisp
members where they're necessary.Specifying 2 enables the hidden
vtordisp
members for all virtual bases with virtual functions.#pragma vtordisp(2)
might be necessary to ensure correct performance of dynamic_cast on a partially constructed object. For more information, see Compiler Warning (level 1) C4436.
#pragma vtordisp()
, with no arguments, restores thevtordisp
setting to its initial setting.
(我的翻译理解)
vtordisp pragma只有在使用虚基类的时候才有用。如果一个派生类重写了虚基类的虚函数,并且派生类的构造和析构函数使用指向虚基类的指针调用了这个函数,编译器可能会引入额外隐藏的vtordisp域到类中,连同虚基类(们)。
vtordisp pragma影响它之后的类的布局。/vd0, /vd1, /vd2选项为这个模块指定相同的行为。0或者off压制隐藏的vtordisp成员。只有当不存在this指向的对象的类的构造和析构函数调用虚函数的时候才关闭vtordisp。
指定1或者on,默认行为,在需要的时候添加vtordisp。
指定2,对于有虚函数的虚基类都添加vtordisp成员。为了保证在部分构造的对象上dynamic_cast的准确效率,#pragma vtordisp(2)可能是必须的。
没有参数的 #pragma vtordisp()
恢复vtordisp的设置为初始设置。
我的理解是出现下面这样的情况,编译器可能会在派生类中添加成员vtordisp
class base {
public:
virtual void test() {}
};
class derived: virtual public base {
public:
int d;
virtual void test() { d =0; }
derived() { test(); }
};
实际测试,关闭vtordisp,同时在派生类的构造函数和析构函数中调用重写的虚基类成员函数的时候,编译没有报错,简单的运行通过了,目前没有进行更全面的测试。