Re: Вызов виртуальных методов в конструкторах
Добавлено: 26 май 2009, 16:23
Как я понимаю (транслировав все теги) ваше утверждение следует из описания конструктора _employee__ctor ?
Т.е. вот этого -
Т.к. _vtable = _employee_vtable; последняя строчка в этом коде из этого и можно сделать вывод что таблица виртуальных методов "заполняется" после, а точнее в конце конструктора?
Хорошо, но почему нельзя утверждать что эта строчка стоит в начале конструктора? Так как конструктор класса employee не объявлен и сгенерирован по умолчанию, о чем даже есть комментарий, значит он пустой. Значит наверняка нельзя сказать куда запишутся строчки и например вызовы виртуальных функций, если мы их добавим в этот конструктор.
Кроме того первым делом тут вызывается конструктор базового класса storage который-то описан и в оригинале содержит единственную строчку -
т.е. stuff = 0; И как далее пишет Ален Голуб вот во что превращается этот конструктор -
по-моему все очевидно и респект ему
Т.е. вот этого -
Код: Выделить всё
_employee__ctor( employee *this ) // Конструктор по умолчанию, генерируемый
{ // компилятором.
_storable_ctor(); // Базовые классы инициализируются
// в первую очередь.
_vtable = _employee_vtable; // Создается таблица виртуальных функций.
}
Хорошо, но почему нельзя утверждать что эта строчка стоит в начале конструктора? Так как конструктор класса employee не объявлен и сгенерирован по умолчанию, о чем даже есть комментарий, значит он пустой. Значит наверняка нельзя сказать куда запишутся строчки и например вызовы виртуальных функций, если мы их добавим в этот конструктор.
Кроме того первым делом тут вызывается конструктор базового класса storage который-то описан и в оригинале содержит единственную строчку -
Код: Выделить всё
storable::storable ( void ) { stuff = 0; }
Код: Выделить всё
_storable__ctor( void ) // конструктор
{
_vtable = _storable__vtable; // Эту строку добавляет компилятор
stuff = 0; // Эта строка из исходного кода.
}