Вызов виртуальных методов в конструкторах

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Аватара пользователя
Airhand
Сообщения: 239
Зарегистрирован: 06 окт 2005, 16:21
Откуда: Dnepropetrovsk

Romeo писал(а):Речь не идёт об изменении порядка операторов. Порядок как раз сохраняется. Это в твоей идее порядок был неверным. Сорри, конечно, но ты реально ЖИРАФ.
Это ты, наверное, жираф. В главе ясно написано:
_storable__ctor( void ) // конструктор
{
_vtable = _storable__vtable; // Эту строку добавляет компилятор
stuff = 0; // Эта строка из исходного кода.
}
Таким образом, vtb присваевается ДО пользовательского кода, а если последним действием конструктора - то ПОСЛЕ пользовательского кода.

Отлистай назад и ты найдёшь моё упоминание о том, что ВСЕ версии VC имеют одинаковое поведение в этом случае. Это как раз тот случай, когда смотришь в книгу и видишь фигу. Я начинал сидеть с VC 5.0, сейчас сижу на VC 2008. Никаких изменений в плане генерации кода для нашего случая.
Всё равно, обобщать нельзя, так это неверно для всех компиляторов всех фирм, даже если мелкомягкие так делают.

Я в шоке с тебя. Начинаем всё сначала? Мне копировать свой пост со второй закладки этой темы? Таблица виртуальных функций используется ВСЕГДА при виртуальных вызовах!
Мы уже разобрась, что никого "виртуального вызова" в кострукторе нет, там не работают виртуальные функции.
Я прочитал эту статью ни разу не перескочив и не пропустив ни слова. Это особенности моей работы. В отличии от тебя, я читаю очень внимательно, потому что я - программист.
Какая любовь к себе. Ты ничего обо мне не знаеш и делаеш выводы, вот уж точно учитель.
Оптимизация по скорости:
#define while if
Оптимизация по размеру:
#define struct union
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

&quot писал(а):Таким образом, vtb присваевается ДО пользовательского кода, а если последним действием конструктора - то ПОСЛЕ пользовательского кода.
Ты не только не читаешь то, что говорил я, но даже уже не помнишь то, о чём говорил ты сам. О том, что присваивание вызывается ПОСЛЕ пользовательского кода говорил как раз ТЫ, а я не я. И мы выяснили, что это неправильно. Вот твоя самая первая цитата, которую ты отстаивал очень долго:
&quot писал(а): Всё очень просто: таблица виртуальных фунций создаётся после конструктора, поэтому вызов виртуальной функции в конструкторе не будет виртуальным, будет вызвана функция того класса, где производится вызов.
Я, точно также, как и Голуб, говорил, что присваивание вызывается ДО пользовательского кода. Отличие было в том, что я на схеме нарисовал это присваивания вне конструктора, а Голуб написал первым оператором внутри конструктора (кстати, если бы он захотел написать его снаружи, что более правильно, у него бы не получилось, так как он писал это в виде С++ кода, который бы стал неправилен с точки зрения синтаксиса, в то время как я использовал схему и мне это было позволено).

Только не задавай вопрос "Почему вне конструктора более правильно?". Я на этот вопрос уже ответил ранее.

Я уже уяснил, что ты не понимаешь слова. Сразу изображаю схематический вариант:

Код: Выделить всё

// Мой вариант
vptr = &A()
{
   // Операторы конструктора
}

// Вариант Голуба
{
   vptr = &A()
   // Операторы конструктора
}
Вперёд, ищи отличия в поведении.
&quot писал(а):Всё равно, обобщать нельзя, так это неверно для всех компиляторов всех фирм, даже если мелкомягкие так делают.
Да никто не обобщает. Я с самого начала писал, что речь идёт о VC компиляторах. Ты просто не прочёл этого. Собственно, ничего страшного, мы уже привыкли.
&quot писал(а):Мы уже разобрась, что никого "виртуального вызова" в кострукторе нет, там не работают виртуальные функции.
То есть ты даже не помнишь с чего начался спор? Открой первые посты в теме и перечитай. У нас есть вариант косвенного вызова виртуального метода. Если бы BBB об этом не вспомнил, у нас бы не завязалась столь жаркая беседа.
&quot писал(а):Какая любовь к себе. Ты ничего обо мне не знаеш и делаеш выводы, вот уж точно учитель.
Да о чём ты говоришь. Ты всем нам это доказал своими постами. Мои выводы не взяты с потолка. Ты действительно не умеешь не то, что читать, а даже качественно усваивать информацию, даже когда эта информация пять раз пережёвана и положена тебе в рот и, ко всему прочему, рядом стоят два человека один держит за верхнюю челюсть, другой за нижнюю и жевать помогают. Ты даже слова "знаешь" и "делаешь" не научился писать с мягким знаком. О чём тут ещё можно говорить?

P.S. Жду последнего подтверждения, что ты понял, что моя схема и схема Голуба по сути одна и та же и закрываю тему.
--------------------------------------------------------------------------------
Добавлено сообщение
--------------------------------------------------------------------------------
ОК, ответа не дождался. Молчание - знак согласия. Тема закрыта.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Закрыто