什么时候vptr(指向vtable)被初始化为多态类?

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或其基类子对象之一,则行为未定义.