La maquinaria para llamadas virtuales (normalmente una tabla v, pero no necesita estar) se configura durante ctor-initializer, después de la construcción de subobjetos base y antes de la construcción de miembros. Sección [class.base.init]
decretos:
Las funciones de miembro (incluidas las funciones miembro virtual, 10.3) se pueden llamar para un objeto en construcción. Del mismo modo, un objeto en construcción puede ser el operando del operador typeid
(5.2.8) o de un dynamic_cast
(5.2.7). Sin embargo, si estas operaciones se realizan en un ctor-inicializador (o en una función llamada directa o indirectamente de un ctor-inicializador) antes de todos los MEM-inicializadores para clases de base han completado, el resultado de la operación es indefinido.
En realidad, durante la construcción de los subobjetos base, existe la maquinaria de función virtual, pero está configurada para la clase base. Sección [class.cdtor
] dice:
Las funciones miembro, incluyendo las funciones virtuales (10.3), se puede llamar durante la construcción o destrucción (12.6.2). Cuando una función virtual es llamada directa o indirectamente desde un constructor o desde un destructor, incluso durante la construcción o destrucción de los miembros de datos no estáticos de la clase, y el objeto al que se aplica la llamada es el objeto (llámelo x
) en construcción o destrucción, la función llamada es la desbordamiento final en la clase del constructor o del destructor y no una sobrescritura en una clase más derivada. Si la llamada a función virtual usa un acceso de miembro de clase explícito (5.2.5) y la expresión de objeto hace referencia al objeto completo de x
o uno de los subobjetos de clase base de ese objeto pero no a x
o uno de sus subobjetos de clase base, el comportamiento no está definido .
Doe s esto significa que el 'vptr' se modificará cada vez que se construyan los subobjetos base, si hay muchos niveles de derivación? – fengqi