Re[4]: Проблема с виртуальной функцией
От: Андрей Тарасевич Беларусь  
Дата: 22.06.02 05:02
Оценка: 10 (1)
Здравствуйте OlegT, Вы писали:

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

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

Яблоки и язык С++ — две приниципиально разные вещи. Яблоки начали падать на головы значительно раньше, чем Ньютон придумал для них закон. Падение яблок объективно, а Ньютон лишь описал это явление являсь сторонним наблюдателем. Компиляторы же языка С++, смею заметить, не были обнаружены археологами в развалинах египетских пирамид и не прилетали с неизвестных планет в метеоритах. Поэтому нет никакой необходимости применять к этим компиляторам "исследовательский подход", тестируя их методом черного ящика и бессонными ночами ломая голову над интерпретацией результатов экспериментов. Компиляторы языка С++ реализуются дяденьками и тетеньками в штатах фирм разработчиков. Эти дяденьки и тетеньки прекрасно понимают, что компилятор должен быть реализован в соотвтетсвии с заветами и пожеланиями других дяденек и тетенек из комитета по стандартизации. Это лет десять назад можно было говорить, что стандарт языка С++ "растет" из его реализаций. С тех пор много воды утекло. В наше время реализация полностью определяется стандартом. Несоответствие реализации стандарту есть баг реализации, а не баг стандарта. Соотвествие реализауии стандарту — это не случайность, это результат сознательного дейсвия разработчиков компилятора. То, что виртуальные функции вызываются из конструктора объекта статически — это не результат оптимизаци, это наиболее простой и эффективный способ заставить программу вести себя так, как она и должна себя вести, согласно спецификации языка.

Насчет "иначе строить иерархические древовидные конструкции не имеет никакого смысла"- это совершенно неверно. (Конструкции эти, строго говоря, не обязательно древовидны, но дело не в этом.) Вопросы о возможности виртуального вызова виртуальной функции из конструктора и деструктора объекта возникают, разумеется, не на пустом месте. Несложно привести примеры ситуаций, в которых такая возможность была бы весьма полезна и, при соблюдении определенных "правил игры", вела бы себя совершенно корректно. Во многих случаях именно на эти ситуации натыкаются программисты, которые потом задают в конференциях пообные вопросы. Пример того же Borland Pascal 7 использует несколько иной протокол инициализации указателя на VMT в конструкоре класса и из его конструкоров виртуальные методы вызываются также как и из любых других, т.е. виртуально. Так что ни о каком "иначе ... не имеет никакого смысла" речи быть не может.
Best regards,
Андрей Тарасевич
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.