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