Просто для справки, поведение указано в § 12.7 2-3 C ++ 03:
2) Чтобы явно или неявно преобразовать указатель (lvalue), ссылающийся на объект класса X, в указатель (ссылку) на прямой или косвенный базовый класс B of X, конструкцию X и конструкцию всех его прямые или косвенные основания, которые прямо или косвенно вытекают из B, должны начаться, а уничтожение этих классов не должно быть завершено, в противном случае преобразование приведет к неопределенному поведению.
this
- указатель на Derived
. В Base::Base()
, this
неявно приводится к Base*
, что разрешено, потому что началось построение Derived, и у него нет других баз, производных от Base
.
§ 12.7 2 продолжается:
Чтобы сформировать указатель на (или получить доступ к значению) прямого нестатического члена объекта obj, должно начаться создание объекта obj, а его уничтожение не должно быть завершено, в противном случае вычисление значения указателя (или получение доступа к значение элемента) приводит к неопределенному поведению.
Наконец, § 12.7 3 также важен:
3) Функции-члены, включая виртуальные функции (10.3), могут вызываться во время создания или уничтожения (12.6.2). Когда виртуальная функция вызывается прямо или косвенно из конструктора (в том числе из mem-initializer для члена данных) или из деструктора, и объект, к которому применяется вызов, является объектом, находящимся в стадии строительства или уничтожения вызываемая функция - это та, которая определена в собственном классе конструктора или деструктора или в одной из его баз, но не функция, переопределяющая ее в классе, производном от класса конструктора или деструктора, или переопределяющая его в одной из других баз классы самого производного объекта (1.8). Если вызов виртуальной функции использует явный доступ к члену класса (5.2.5), а выражение объекта ссылается на объект, находящийся в процессе создания или уничтожения, но его тип не является ни собственным классом конструктора, ни деструктора, ни одной из его баз, результат звонок не определен.
Эти два предложения означают, что экземпляр Derived
является полноценным Base
, как только начинается конструктор Base
, хотя он может находиться в несовместимом состоянии.