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

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

Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

ОК, я хотел по-хорошему, но ты так не умеешь и чувствуешь себя значительно более комфортно, когда о тебе говоря всё сермяжную правду.
&quot писал(а):сначало убедись в этом и не будет таких смешных ситуаций.
Ничего в этом смешного не вижу. Что действительно весело, так это твои постоянные фэйлы.
&quot писал(а):Пошли отмазки типа "это не я и хата не моя". Она ничем не хороша, т.к. она неверная.
Не вижу ни одной отмазки. Внимательно читай - я устал тебе постоянно открывать глаза и по 5 раз повторять одно и то же, пока ты наконец-то не скажешь "Может я и не прав". Я с самого начала сказал, что это не код, а схема, именно СХЕМА. Но она, тем не менее, максимально приближена к истине и более корректна, чем псеводкод, написанный автором статьи. Почему? Я уже объяснил почему. Прочти ещё раз "и не будет таких смешных ситуаций" ( (с) забыл кто).
&quot писал(а):И оставь эти попытки быть психоаналитиком.
У, какой ты мнительный фантазёр. Кстати, этот специалист бы тебе не помешал, так как тебе следует бороться со своим комплексом "всё-неправильно-я-один-тру".
&quot писал(а):Будь лучще тем, на кого учился.
Так вот этим как раз и занимаюсь, если ты не заметил, - учу тебя. У меня в дипломе помимо "программист" написано "математик, учитель информатики".
&quot писал(а):Вы делаете вывод, что это тайна великая есть и никто другой ее уже не в состоянии раскрыть?
Нет, BBB, немного не так. Он считает, что раскрыть её может только он и только ему одним известными методами. А то, что его объяснения являются наивными и алогичными, это его совсем не смущает и вместо чётких объяснений он постоянно ссылается либо на статью, либо обходится максимально размытыми формулировками. И причины такого поведения, кстати, тоже понятны. Как только Airhand, опускается до конкретики (такое было за всё время обсуждения всего два раза), то он приоткрывает нам все чудеса своих закромов со знаниями и мы поражаемся тому, насколько скудны последние и перемешаны.

Давай поставим эксперимент во благо науки (в первую очередь во благо генетики, а уже во вторую очередь во имя психоаналитики, столь нежно воспетой подопытным в предыдущем сообщении).

Airhand, ответь-ка на простой вопрос. Как происходит косвенный вызов виртуального метода в конструкторе, если в этот момент указатель на таблицу виртуальных функций ещё не выставлен?

Не юли и отвечай прямо, как ты думаешь. Не съезжай, что об этом в статье ничего нет: да мы знаем, что нет, но если ты высказываешь гипотезу, то будь готов её обосновать своими словами, а не скопированным текстом из третьих источников. Также не вздумай проигнорировать вопрос, так как иначе будем расценивать твои действия, как трусость.

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

BBB
А для Вас Алена Голуб - это единственный и неповторимый авторитет? Т.е. если он что-то о чем-то не упоминает (не важно, либо просто не упоминает, либо не знает этого), то Вы делаете вывод, что это тайна великая есть и никто другой ее уже не в состоянии раскрыть?
1. Если вас устраивает обращение на "вы", то так и буду к вам обращаться, а мне не надо "выкать".
2. Ален Голуб не панацея, просто я констировал факт, что у него нет. Это не значит, что другие авторы не в счёт, просто он был приведен мною, а там этого не оказалось. Может это вообще не регламентировано стандартом и зависит от реализации. В таком случае я хочу это видеть.

Romeo
ОК, я хотел по-хорошему, но ты так не умеешь и чувствуешь себя значительно более комфортно, когда о тебе говоря всё сермяжную правду.
Ты меня не знаешь и уж тем-более не знаешь что я умею, а что нет. Не позорся, не выставляй себя <слово удалено цензурой>.
Ничего в этом смешного не вижу. Что действительно весело, так это твои постоянные фэйлы.
Ну ты жжошь. Сначало назвал не мой код "шедевром". Потом охаял его. А когда выяснилось, что код не мой, так тут нет ничего смешного.
Так вот этим как раз и занимаюсь, если ты не заметил, - учу тебя. У меня в дипломе помимо "программист" написано "математик, учитель информатики".
Меня не надо учить, я имею диплом.
Нет, BBB, немного не так. Он считает, что раскрыть её может только он и только ему одним известными методами. А то, что его объяснения являются наивными и алогичными, это его совсем не смущает и вместо чётких объяснений он постоянно ссылается либо на статью, либо обходится максимально размытыми формулировками. И причины такого поведения, кстати, тоже понятны. Как только Airhand, опускается до конкретики (такое было за всё время обсуждения всего два раза), то он приоткрывает нам все чудеса своих закромов со знаниями и мы поражаемся тому, насколько скудны последние и перемешаны.
Я уже говорил, что я считаю, тебе не известно. Расписывайся за себя и не будеш смешон.
И я не постоянно ссылась на статью, я уже говорил, что если ты прав приведи ссылку или цытату того же Бьярна Страуструпа.
Давай поставим эксперимент во благо науки (в первую очередь во благо генетики, а уже во вторую очередь во имя психоаналитики, столь нежно воспетой подопытным в предыдущем сообщении).
Эксперименты будеш ставить на мышах или себе.
Оптимизация по скорости:
#define while if
Оптимизация по размеру:
#define struct union
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

&quot писал(а):Ты меня не знаешь и уж тем-более не знаешь что я умею, а что нет.
Знаю, что ты умеешь. Ты умеешь трепаться. Ни одного слова по делу.
&quot писал(а):Ну ты жжошь. Сначало назвал не мой код "шедевром". Потом охаял его. А когда выяснилось, что код не мой, так тут нет ничего смешного.
Не уловил логической цепочки. То, что ты наивно посчитал мой термин "шедевр" за положительную оценку, это я понял. А вот из чего следует третье предложение, это осталось для меня загадкой.
&quot писал(а):Меня не надо учить, я имею диплом.
Заверни в свой диплом бутерброд и съезди на природу - хоть какая-то польза будет.
&quot писал(а):я уже говорил, что если ты прав приведи ссылку или цытату того же Бьярна Страуструпа.
Цып-цып, на цыпочках, цыплёнок, цыкнуть. Диплом у тебя, случаем не об окончании 7 классов?

Так, я сейчас последний раз буду повторяться. Я устал писать всё по несколько раз. Читай мои сообщения неоднократно и очень медленно в предвкушении озарения, если не получается понять в первого раза.

То, что мы сейчас обсуждаем является низкоуровневой реализацией компилятора. Стандартом это никак не закреплено (кроме запрета виртуализации в конструкторах), поэтому разработчики компилятор вправе это тюнинговать так, как им нравится. Другой вопрос в том, что есть понятие целесообразности. А согласно целесообразности, практически все компиляторы реализованы схожим образом. Потому доказательство того, о чём мы сейчас говорим - это не статья, написанная любым корифеем, а программа, показывающая как на самом деле всё работает.

Я своё доказательство привёл. Настал твой черёд. Я жду ответа на вопрос. За свои слова нужно отвечать. Докажи, что твой диплом - не бумажка.

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

Это не ты писал ?
Romeo писал(а):Теперь вспоминаем пункт №1 и понимаем, что если при виртуальном вызове не происходит никаких проверок, то для того, чтобы добиться runtime ошибки о вызове чисто виртуального метода, нам нужно, чтобы раньше, до входа в конструктор, указатель на таблицу уже был установлен на таблицу виртуальных методов класса A.
А теперь говариш "схема". Да я не прав, когда говорил, что указатель на vtbl инициазируется после конструктора. Но и ты неправ, когда утверждал, что он инициализируется ДО. На самом деле этот указатель инициализируется В конструкторе.
Стандартом это никак не закреплено (кроме запрета виртуализации в конструкторах)
Надо было так и сказать, а не разводить тут флуд про vtbl.
Другой вопрос в том, что есть понятие целесообразности. А согласно целесообразности, практически все компиляторы реализованы схожим образом. Потому доказательство того, о чём мы сейчас говорим - это не статья, написанная любым корифеем, а программа, показывающая как на самом деле всё работает.
Если это зависит от реализации компилятора, то что может доказать программа ? Что для данного компилятора - это так ?
Оптимизация по скорости:
#define while if
Оптимизация по размеру:
#define struct union
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

Airhand писал(а):... ты утверждал, что он инициализируется ДО. На самом деле этот указатель инициализируется В конструкторе.
Еще раз. На операторе "begin" конструктора - это ДО или В? С точки знения "внутренностей" языка, можно сказать "В", т.е. во время действий, происходящих при входе в процедуру, но до того, как управление получит первый написанный программистом оператор этой процедуры. Но, т.к. это происходит ДО того, как управление получит первый написанный программистом оператор этой процедуры, то можно также сказать и "ДО".
Если это зависит от реализации компилятора, то что может доказать программа? Что для данного компилятора - это так ?
Эээ... Romeo с самого начала это и подчеркивал (и даже неоднократно), что речь идет о КОНКРЕТНОМ компиляторе - MS VC, на котором он проводил практические иследования.
Аватара пользователя
Airhand
Сообщения: 239
Зарегистрирован: 06 окт 2005, 16:21
Откуда: Dnepropetrovsk

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

&quot писал(а):А теперь говариш "схема". Да я не прав, когда говорил, что указатель на vtbl инициазируется после конструктора. Но и ты неправ, когда утверждал, что он инициализируется ДО. На самом деле этот указатель инициализируется В конструкторе.
Мы уже опустились до уровня кода, который генерируется ассемблером, верно? Так вот, можешь объяснить как ты будешь на уровне ассемблера различать код, который идёт сразу перед и сразу после знака "{"? Тебе BBB, об этом уже сказал три раза, теперь говорю я. Интересно когда ты наконец-то прочтёшь это. Даже скажу точнее, когда ты поймёшь это, так как проблема, по всей видимости именно в понимании.
&quot писал(а):ДО конструктора и В конструкоре - есть разница ?
Если сравнивать "строго перед конструктором" и "первым оператором в конструкторе", то разницы никакой.
&quot писал(а):Надо было так и сказать, а не разводить тут флуд про vtbl.
Я это сказал с самого начала, а потом повторил два раза. Ты просто не умеешь внимательно читать и, как следствие, "разводишь флуд".
&quot писал(а):Если это зависит от реализации компилятора, то что может доказать программа ? Что для данного компилятора - это так ?
Да, это проверка для компилятора от Microsoft. Об этом я тоже писал как минимум три раза, но ты меня не читаешь. Более того, достаточно откомпилировать эту программу на других компиляторах и запустить её, чтобы понять, что все они, точнее подавляющее большинство устроено именно так. То есть VC, Borland C++, Borlan Builder, Watcom, IBM, иксовые gcc, vacpp, xlc - все они используют один и тот же подход. Я вообще в жизни своей не встречал компилятора, который генерирует код по другому, но по слухам слышал, что люди встречались с отличиями на экзотических платформах для мобильников.

Да, стандартом не закреплено, но целесообразность - веский аргумент.

Почему ты не выдвигаешь претензии к статье Алана Голуба? Он ведь тоже описывает те же самые детали, что и я, они ведь не стандартизированы. Кстати, я об этом тебе замечал ранее, но ты как обычно всё пропустил мимо.

P.S. Кстати, Airhand, вот статейка. Прочти её очень внимательно. Весьма поучительная вещь. Уверен, что тебе она поможет.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
Airhand
Сообщения: 239
Зарегистрирован: 06 окт 2005, 16:21
Откуда: Dnepropetrovsk

Romeo писал(а):Мы уже опустились до уровня кода, который генерируется ассемблером, верно? .
Не верно. Ты попробуй два оператора поменяей местами и тогда поймешь, может быть.
Да, это проверка для компилятора от Microsoft. Об этом я тоже писал как минимум три раза, но ты меня не читаешь. Более того, достаточно откомпилировать эту программу на других компиляторах и запустить её, чтобы понять, что все они, точнее подавляющее большинство устроено именно так. То есть VC, Borland C++, Borlan Builder, Watcom, IBM, иксовые gcc, vacpp, xlc - все они используют один и тот же подход. Я вообще в жизни своей не встречал компилятора, который генерирует код по другому, но по слухам слышал, что люди встречались с отличиями на экзотических платформах для мобильников.
Под компилятор, какой версии ? Я уже спрашивал. Но, видимо, ты плохо знаеш математику, раз обобщаешь неверно.
Да, стандартом не закреплено, но целесообразность - веский аргумент.
Ответь тогда на простой вопрос: зачем инициализировать vtbl если её не использовать ? "целесообразность" где ?
Почему ты не выдвигаешь претензии к статье Алана Голуба? Он ведь тоже описывает те же самые детали, что и я, они ведь не стандартизированы. Кстати, я об этом тебе замечал ранее, но ты как обычно всё пропустил мимо.
Это не статья, а глава из книги. Выдвигать претензии к книге - это как-то по-твоему.

P.S. Кстати, Airhand, вот статейка. Прочти её очень внимательно. Весьма поучительная вещь. Уверен, что тебе она поможет.
Это для тебя как раз статейка.

P.S. Ты пропускаеш мои вопросы.
Оптимизация по скорости:
#define while if
Оптимизация по размеру:
#define struct union
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

Airhand писал(а):Но, видимо, ты плохо знаеш математику, раз обобщаешь неверно.
Извините, пожалуйста, будьте так любезны... Вы не сформулируете правило русского языка, согласно которому слово "обобщаешь" пишется с мягким знаком на конце, а слово "знаеш" - без мягкого знака на конце?
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

&quot писал(а):Не верно. Ты попробуй два оператора поменяей местами и тогда поймешь, может быть.
Речь не идёт об изменении порядка операторов. Порядок как раз сохраняется. Это в твоей идее порядок был неверным. Сорри, конечно, но ты реально ЖИРАФ. До тебе доходит с огромным трудом и даже когда ты считаешь, что вот, всё, наконец-то дошло, оказывается, что дошло неправильно. И при всём этом ты считаешь, что ты здесь умнее всех.

ОК, у тебя не получается рассуждать логически, давай я тебе дам конкретный пример:

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

// case 1
void main()
{
   int i, j;

   i = 1;
   {
      j = 2;
   }

   printf("%d, %d\n", i, j);
}

// case 2
void main()
{
   int i, j;

   {
      i = 1;
      j = 2;
   }

   printf("%d, %d\n", i, j);
}
Предлагаю тебе указать в чём будет отличаться поведение case 1 и case 2. Теперь ты наконец понял, что не о смене порядка мы говорили?
&quot писал(а):Под компилятор, какой версии ? Я уже спрашивал. Но, видимо, ты плохо знаеш математику, раз обобщаешь неверно.
Отлистай назад и ты найдёшь моё упоминание о том, что ВСЕ версии VC имеют одинаковое поведение в этом случае. Это как раз тот случай, когда смотришь в книгу и видишь фигу. Я начинал сидеть с VC 5.0, сейчас сижу на VC 2008. Никаких изменений в плане генерации кода для нашего случая.

Кстати, дорогой мой дипломированный специалист. "Ишь", "ешь" пишутся с мягким знаком.
&quot писал(а):Ответь тогда на простой вопрос: зачем инициализировать vtbl если её не использовать ? "целесообразность" где ?
Я в шоке с тебя. Начинаем всё сначала? Мне копировать свой пост со второй закладки этой темы? Таблица виртуальных функций используется ВСЕГДА при виртуальных вызовах! И при вызове виртуальной функции НЕ ДЕЛАЕТСЯ НИКАКИХ ПРОВЕРОК (это я не кричу, это я проверяю очередное предположение, может ты видишь плохо). Поэтому, чтобы добиться того, что требует стандарт (отсутствие виртуализации в конструкторах), используется такой хитрый приём, когда перед выполнением операторов конструктора проставляет в указатель на виртуальную таблицу адрес виртуальной таблицы текущего класса. Вот в чём смысл! Это уже было разжёвано.
&quot писал(а):Это для тебя как раз статейка.
Я прочитал эту статью ни разу не перескочив и не пропустив ни слова. Это особенности моей работы. В отличии от тебя, я читаю очень внимательно, потому что я - программист.

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