iam*_*ind 7 c++ constructor overriding virtual-functions vptr
这不是关于"什么时候创建VTABLE?" .相反,什么时候应该初始化VPTR?它是在构造函数的开头/结尾还是在构造函数之前/之后?
A::A () : i(0), j(0) -->> here ?
{
-->> here ?
//...
-->> here ?
}
Run Code Online (Sandbox Code Playgroud)
Ben*_*igt 18
用于虚拟调用的机器(通常是v表,但不需要)在ctor-initializer期间,在构建基础子对象之后和成员构建之前设置.部分[class.base.init]法令:
可以为正在构造的对象调用成员函数(包括虚拟成员函数,10.3).类似地,正在构造的对象可以是运算
typeid符(5.2.8)或dynamic_cast(5.2.7)的操作数.但是,如果在基类的所有mem-initializer完成之前,在ctor-initializer(或直接或间接从ctor-initializer调用的函数)中执行这些操作,则操作的结果是不确定的.
实际上,在构建基础子对象期间,存在虚函数机制,但是它是为基类设置的.第[ class.cdtor] 节说:
成员函数,包括虚函数(10.3),可以在构造或销毁期间调用(12.6.2).当从构造函数或析构函数直接或间接调用虚函数时,包括在构造或销毁类的非静态数据成员期间,以及调用所适用的对象是
x正在构建的对象(称之为)或destroy,被调用的函数是构造函数或析构函数类中的最终覆盖,而不是在更多派生类中覆盖它.如果虚函数调用使用显式类成员访问(5.2.5)并且对象表达式引用x该对象的基类子对象的完整对象或其中一个基类子对象x或其基类子对象之一,则行为未定义.