|
virtual methods
|
|||
---|---|---|---|
#18+
Basil A. Sidorov, какая разница - виртуальный метод или не виртуальный, если программист написал delete, деструктор освободил ресурс, а потом программа дёргает метод, использующий уже освобождённый ресурс? От такой дури спасут только смарт-указатели. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2018, 12:08 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Leonid KudryavtsevЕсли без виртуальных методов, то это только переопределять целиком конструктор/диструктор и copy-past... ерунда какая-то получается.Невиртуальный деструктор предка можно из деструктора потомка и ручками дёрнуть - тоже не проблема... ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2018, 12:10 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_devLeonid KudryavtsevЕсли без виртуальных методов, то это только переопределять целиком конструктор/диструктор и copy-past... ерунда какая-то получается.Невиртуальный деструктор предка можно из деструктора потомка и ручками дёрнуть - тоже не проблема... переопределить поведение " в середине " данного алгоритма или плодить callback'и, что бред. Или virtual методы, просто понятно и красиво. p.s. Сам пытаюсь в конструкторах/деструкторах иметь минимум логики. Но чисто гипотетически, вполне можно представить необходимость такого ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2018, 12:17 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Leonid KudryavtsevА если у меня достаточно сложный алгоритм инициализации/убийства и я хочуГоре от ума. Если вы создаёте избыточно сложную конструкцию, то рано или поздно вы перехитрите самого себя. Или даже не вы, а человек, который унаследовался от вашего объекта и, не подумав (не дочитав документацию), переопределил виртуальный метод. В конструкторах виртуальный метод может вызвать метод (далёкого) потомка до вызова конструктора этого потомка. В лучшем случае вы будете манипулировать неинициализированными полями, в худшем - просто мусором. Аналогично, в деструкторах, виртуальный метод потомка может манипулировать объектом, для предка которого уже вызван деструктор. Поэтому - всё как обычно: вместо того, чтобы бороться с последствиями проблемы, проблему просто не надо создавать. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2018, 12:28 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Basil A. Sidorov... В конструкторах виртуальный метод может вызвать метод (далёкого) потомка до вызова конструктора этого потомка. В лучшем случае вы будете манипулировать неинициализированными полями, в худшем - просто мусором. Аналогично, в деструкторах, виртуальный метод потомка может манипулировать объектом, для предка которого уже вызван деструктор. Поэтому - всё как обычно: вместо того, чтобы бороться с последствиями проблемы, проблему просто не надо создавать. Спасибо за разъяснения. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2018, 12:35 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Basil A. SidorovВ конструкторах виртуальный метод может вызвать метод (далёкого) потомка до вызова конструктора этого потомка. В лучшем случае вы будете манипулировать неинициализированными полями, в худшем - просто мусором. Аналогично, в деструкторах, виртуальный метод потомка может манипулировать объектом, для предка которого уже вызван деструктор.Не может. Ни в конструкторе, ни в деструкторе. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2018, 12:50 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Basil A. SidorovВ конструкторах виртуальный метод может вызвать метод (далёкого) потомка до вызова конструктора этого потомка.неа, не может. конструктор предка не знает, есть у него потомок или нет. Он вызовет свою реализацию метода, если она есть или упадёт с криком "pure virtual function call". если повезёт, а если не повезёт, то предстоят мучительные часы медитации над вопросом почему код, который я написал - вообще не вызывается) . Ну а в деструкторе - обратная проблема ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2018, 12:54 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Вон в стандарте написано (раздел 12.7):Member functions, including virtual functions (10.3), can be called during construction or destruction (12.6.2). When a virtual function is called directly or indirectly from a constructor or from a destructor, including during the construction or destruction of the class’s non-static data members, and the object to which the call applies is the object (call it x) under construction or destruction, the function called is the final overrider in the constructor’s or destructor’s class and not the one overriding it in a more-derived class. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2018, 13:04 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Таким образом, комитет по стандартизации озадачился проблемой настолько, что таблица виртуальных методов специальном образом "хачится" в конструкторах/деструкторах, чтобы, не дай бог, не дёрнуть метод из иерархии предков. Кто там чего говорил про безопасность и понятность вызова виртальных методов в фазе инициализации и разрушения объектов? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2018, 13:22 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Basil A. SidorovТаким образом, комитет по стандартизации озадачился проблемой настолько, что таблица виртуальных методов специальном образом "хачится" в конструкторах/деструкторах, чтобы, не дай бог, не дёрнуть метод из иерархии предков. Ну в стандарте напрямую таблица виртуальных методов вообще не упоминается. Но так то да, в конструкторах и деструкторах помимо вашего кода есть еще немножко: установка указателя vmt, вызов конструктора/деструктора предка. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2018, 13:35 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Basil A. SidorovТаким образом, комитет по стандартизации озадачился проблемой настолько, что таблица виртуальных методов специальном образом "хачится" в конструкторах/деструкторах, чтобы, не дай бог, не дёрнуть метод из иерархии предков.Только не таблица, а указатель на эту таблицу - первый элемент экземпляра класса, на который указывает this. Сама таблица может преспокойно жить в read-only памяти. Иными словами, перед вызовом конструктора/деструктора компилятор вставляет код, меняющий указатель на таблицу виртуальных методов соответствующего класса. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2018, 13:44 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Basil A. Sidorov....таблица виртуальных методов специальном образом "хачится" в конструкторах/деструкторах, чтобы, не дай бог, не дёрнуть метод из иерархии предков.... есть подозрение, что "хачить" ее приходится по причине множественного наследования (где AFAIK тоже есть слова virtual для предков) rdb_dev....Иными словами, перед вызовом конструктора/деструктора компилятор вставляет код, меняющий указатель на таблицу виртуальных методов соответствующего класса. Спасибо. Лично я таких подробностей не знал. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2018, 13:47 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Для множественного наследования есть более-менее нетривиальные правила, которые можно запомнить и научиться применять: в конце-концов, мы знаем, на что идём. Для виртуальных методов в конструкторах/деструкторах "знать" - просто невозможно. Или вы будете работать с полусозданными (полуразрушенными) объектами или вы изменяете механизм виртуализации вызова методов в конструкторах и деструкторах. Комитет выбрал второй вариант, хотя для этого разработчикам компиляторов приходится добавлять в конструкторы и деструкторы больше служебного кода. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2018, 14:01 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Leonid KudryavtsevСпасибо. Лично я таких подробностей не знал.Проверяется несложно - выставляются точки останова в конструкторах и деструкторах по всей иерархии наследования, а в отладчике выставляется наблюдение за (size_t)*this ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2018, 14:04 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Basil A. Sidorov, ну ведь кто-то должен проинициализировать указатель на vmt. Вот он в конструкторе и инициализируется. Тут все вполне логично. Сконструировали предков, выставили адрес vmt, потом выполнили пользовательский код. В деструкторе да, повторное выставление этого указателя - как бы "лишний" код. Ну тут видимо по соображениям симметрии. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2018, 14:07 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Basil A. SidorovКомитет выбрал второй вариант, хотя для этого разработчикам компиляторов приходится добавлять в конструкторы и деструкторы больше служебного кода.Я тебе больше скажу - некоторые компиляторы добавляют в таблицу виртуальных методов указатели на служебные ВИРТУАЛЬНЫЕ конструкторы. :) ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2018, 14:08 |
|
virtual methods
|
|||
---|---|---|---|
#18+
BarloneBasil A. Sidorov, ну ведь кто-то должен проинициализировать указатель на vmt. Вот он в конструкторе и инициализируется. Тут все вполне логично.Это всё понятно. Просто мои наивные представления предполагали, что таблица виртуальных методов будет инициализирована по итоговому (создаваемому) типу - это минимум кода и, соответственно, минимум телодвижений. Если в конструкторах/деструкторах не используются виртуальные методы - этого вполне достаточно. Но, видимо, эстеты от программирования представляют достаточную опасность, чтобы в стандарте заложились на максимально безопасное поведение, не ограничиваясь простым предупреждением о неопределённом поведении. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2018, 14:51 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Basil A. SidorovНо, видимо, эстеты от программирования представляют достаточную опасность, чтобы в стандарте заложились на максимально безопасное поведение, не ограничиваясь простым предупреждением о неопределённом поведении.Потому я и настаиваю на дуракоустойчивой реализации методов, а ты мне - проктостоматология, проктостоматология!... ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2018, 14:55 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_devпроктостоматология, проктостоматология!... У вас есть другое определение для использования виртуальных методах в конструкторах и деструкторах? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2018, 15:00 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Basil A. Sidorov, виртуальные методы не причем, если программист сначала пишет delete ptr, а потом ptr->method(), когда ресурсы уже освобождены, а память кучи из под объекта уже выделена на что-то другое. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2018, 15:04 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Leonid KudryavtsevСпасибо. Лично я таких подробностей не знал.Вот поэтому полезно смотреть, как работает с++ код под ассемблером :) ... |
|||
:
Нравится:
Не нравится:
|
|||
25.05.2018, 05:20 |
|
virtual methods
|
|||
---|---|---|---|
#18+
CEMbВот поэтому полезно смотреть, как работает с++ код под ассемблером :)ага, на каждой версии компилятора, используемого в разработке в текущий момент, искать отличия от предыдущих версий, медитировать над ними... ведь работа не х.., стояла и будет стоять))) ... |
|||
:
Нравится:
Не нравится:
|
|||
25.05.2018, 21:41 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_devнекоторые компиляторы добавляют в таблицу виртуальных методов указатели на служебные ВИРТУАЛЬНЫЕ конструкторы. :)Может ты с деструкторами путаешь? Принеси пример. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.05.2018, 01:58 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Вангую что сейчас прозвучит слово борланд )) ... |
|||
:
Нравится:
Не нравится:
|
|||
26.05.2018, 20:29 |
|
|
start [/forum/topic.php?fid=57&msg=39649326&tid=2017692]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
38ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
57ms |
get tp. blocked users: |
1ms |
others: | 272ms |
total: | 413ms |
0 / 0 |