Re[3]: Проблема с виртуальной функцией
От: OlegT  
Дата: 21.06.02 21:55
Оценка: 3 (1)
Здравствуйте Андрей Тарасевич, Вы писали:


АТ>... А теперь загляни в код вызова виртуальной функции класса непосредственно из его конструктора или деструктора, сгенерированный, например, VC6, и ты обнаружишь, что все написанное тобой в этом случае не имеет никакого отношения к действительности.

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

1) Естественно не имеет ... не надо принимать все так близко к сердцу :-). Это логика построения объекта, которую достаточно знать, чтобы понять практически все тонкие вопросы связанные с этим процессом.
2) Я бы еще поспорил как это происходило в самых первых версиях компиляторов С++(Скажем в том же CFront 1.0 — 2.0, первом официальном компиляторе с С++, который вообще генерировал С код (см. Страуструп "Дизайн и Эволюция С++", гл. 3.3.1 Генерирование С-кода, стр. 77)). И вообще, то что сейчас творят компиляторы, да еще с включенной оптимизацией, по моему неизвестно даже господу богу(попробуй предположить что сгенерит Intell C++ compiler version 5.1 в строчке z = x/y; и ты будешь довольно приятно удивлен.)
3) Да и не о коде, сгенерированном компилятором речь. Люди тут учатся, им совсем не интерестно, что думают об этом компиляторы, а твой ответ будет полезен им разве что при здаче какого-то экзамена по С++, преподу, фанату ассемблера, или же ... на Brainbench, все — и больше никому,


АТ>А правильный ответ на вопрос "почему?" существенно проще и короче: потому что этого требует стандарт языка С++.

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

Я, конечно, извиняюсь за определенную резкость суждений ... но "я категорически не согласен с твоими суждениями, хотя отдал бы жизнь за то, чтобы ты мог их высказывать"(по-моему Кант, но буду признателен, если кто-то уточнит :-) ).
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.