这不是关于“VTABLE 何时创建?” https://stackoverflow.com/questions/3849498/when-is-vtable-in-c-created。相反,VPTR 应何时初始化?是在构造函数的开头/结尾还是在构造函数之前/之后?
A::A () : i(0), j(0) -->> here ?
{
-->> here ?
//...
-->> here ?
}
虚拟调用机制(通常是 v 表,但不是必须的)是在构造函数初始化器,在构造基础子对象之后和构造成员之前。部分[class.base.init]
法令:
可以为正在构造的对象调用成员函数(包括虚拟成员函数,10.3)。类似地,正在构造的对象可以是typeid
运算符(5.2.8)或dynamic_cast
(5.2.7)。但是,如果这些操作是在构造函数初始化器(或者在直接或间接调用的函数中构造函数初始化器) 在所有之前内存初始化器对于已经完成的基类,操作的结果是未定义的。
实际上,在构造基子对象的过程中,虚函数机制是存在的,但它是为基类设置的。部分 [class.cdtor
] says:
成员函数,包括虚函数(10.3),可以在构造或销毁期间调用(12.6.2)。当从构造函数或析构函数直接或间接调用虚拟函数时,包括在类的非静态数据成员的构造或销毁期间,并且调用所适用的对象是该对象(称为x
)在构造或销毁时,调用的函数是最终的重写者
在构造函数或析构函数的类中,而不是在更派生的类中重写它。如果虚函数调用使用显式类成员访问(5.2.5)并且对象表达式引用了完整的对象x
或该对象的基类子对象之一,但不是x
或其基类子对象之一,行为未定义。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)