Здравствуйте, sharez, Вы писали:
S>Здравствуйте, Sharov, Вы писали:
S>>Осн. идея в том, что обращение к this до создания родительского объекта не валидно. На мой взгляд, вполне разумно и безопасно.
S>Лично я вижу здесь разногласия о том, что должен делать конструктор, а должен он: S>1) Выделить память (это такой атавизм, из которого и растут корни) S>2) Задать свойства S>и так как он технически является ещё и функцией, то S>3) Инициализировать себя S>но этот шаг почему-то встревает между 1 и 2 по необъяснимой причине.
S>Часто натыкаюсь в интернете, что не стоит пользоваться свойством конструктора-функции, т. е. использовать (1,2) и не использовать (3). S>Я же думаю, что выделение памяти это как бы предконструирование объекта, которое вообще должно быть вынесено за пределы контролируемого процесса в ЯВУ, и логически эти пунткы должны группироваться вот так (1)-(2, 3) или (1)-(3, 2), где шаг (1) вообще сокрыт от нас, и вызывается по цепочке отдельно от конструктора. S>Мы же в современных ЯВУ имеем тенденцию склеивать совершенно разнородные процессы (1,2) только ради правильного выделения памяти.
S>Вот как должно быть: когда мы вызываем конктруктор, то он вызывает по цепочке все предконструкторы (без каких-либо параметров) просто для выделения памяти под все поля всех предков, и уже потом оперируем конструктором как собственно виртуальной функцией, вызываем её предков как сами того хотим (или не вызывать вообше, если не хотим).
Вы рассуждаете с той точки зрения, что вызывая n предконструкторов у нас будет n объектов. В реальности child и parent явл. собой один объект (область в памяти). Т.е. конструктор child не заменяет, а расширяет parent конструктор. Без parent конструктора говорить о child смысла нет. Поэтому пляски вокруг базовых конструкторов.