powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / virtual methods
25 сообщений из 356, страница 4 из 15
virtual methods
    #39649305
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov, какая разница - виртуальный метод или не виртуальный, если программист написал delete, деструктор освободил ресурс, а потом программа дёргает метод, использующий уже освобождённый ресурс? От такой дури спасут только смарт-указатели.
...
Рейтинг: 0 / 0
virtual methods
    #39649309
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevЕсли без виртуальных методов, то это только переопределять целиком конструктор/диструктор и copy-past... ерунда какая-то получается.Невиртуальный деструктор предка можно из деструктора потомка и ручками дёрнуть - тоже не проблема...
...
Рейтинг: 0 / 0
virtual methods
    #39649318
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devLeonid KudryavtsevЕсли без виртуальных методов, то это только переопределять целиком конструктор/диструктор и copy-past... ерунда какая-то получается.Невиртуальный деструктор предка можно из деструктора потомка и ручками дёрнуть - тоже не проблема...

переопределить поведение " в середине " данного алгоритма


или плодить callback'и, что бред. Или virtual методы, просто понятно и красиво.

p.s.
Сам пытаюсь в конструкторах/деструкторах иметь минимум логики. Но чисто гипотетически, вполне можно представить необходимость такого
...
Рейтинг: 0 / 0
virtual methods
    #39649326
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevА если у меня достаточно сложный алгоритм инициализации/убийства и я хочуГоре от ума.

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

В конструкторах виртуальный метод может вызвать метод (далёкого) потомка до вызова конструктора этого потомка.
В лучшем случае вы будете манипулировать неинициализированными полями, в худшем - просто мусором.
Аналогично, в деструкторах, виртуальный метод потомка может манипулировать объектом, для предка которого уже вызван деструктор.

Поэтому - всё как обычно: вместо того, чтобы бороться с последствиями проблемы, проблему просто не надо создавать.
...
Рейтинг: 0 / 0
virtual methods
    #39649337
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov...
В конструкторах виртуальный метод может вызвать метод (далёкого) потомка до вызова конструктора этого потомка.
В лучшем случае вы будете манипулировать неинициализированными полями, в худшем - просто мусором.
Аналогично, в деструкторах, виртуальный метод потомка может манипулировать объектом, для предка которого уже вызван деструктор.

Поэтому - всё как обычно: вместо того, чтобы бороться с последствиями проблемы, проблему просто не надо создавать.
Спасибо за разъяснения.
...
Рейтинг: 0 / 0
virtual methods
    #39649358
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovВ конструкторах виртуальный метод может вызвать метод (далёкого) потомка до вызова конструктора этого потомка.
В лучшем случае вы будете манипулировать неинициализированными полями, в худшем - просто мусором.
Аналогично, в деструкторах, виртуальный метод потомка может манипулировать объектом, для предка которого уже вызван деструктор.Не может. Ни в конструкторе, ни в деструкторе.
...
Рейтинг: 0 / 0
virtual methods
    #39649362
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovВ конструкторах виртуальный метод может вызвать метод (далёкого) потомка до вызова конструктора этого потомка.неа, не может. конструктор предка не знает, есть у него потомок или нет. Он вызовет свою реализацию метода, если она есть или упадёт с криком "pure virtual function call". если повезёт, а если не повезёт, то предстоят мучительные часы медитации над вопросом почему код, который я написал - вообще не вызывается) . Ну а в деструкторе - обратная проблема
...
Рейтинг: 0 / 0
virtual methods
    #39649370
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вон в стандарте написано (раздел 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.
...
Рейтинг: 0 / 0
virtual methods
    #39649383
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таким образом, комитет по стандартизации озадачился проблемой настолько, что таблица виртуальных методов специальном образом "хачится" в конструкторах/деструкторах, чтобы, не дай бог, не дёрнуть метод из иерархии предков.

Кто там чего говорил про безопасность и понятность вызова виртальных методов в фазе инициализации и разрушения объектов?
...
Рейтинг: 0 / 0
virtual methods
    #39649406
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovТаким образом, комитет по стандартизации озадачился проблемой настолько, что таблица виртуальных методов специальном образом "хачится" в конструкторах/деструкторах, чтобы, не дай бог, не дёрнуть метод из иерархии предков.
Ну в стандарте напрямую таблица виртуальных методов вообще не упоминается. Но так то да, в конструкторах и деструкторах помимо вашего кода есть еще немножко: установка указателя vmt, вызов конструктора/деструктора предка.
...
Рейтинг: 0 / 0
virtual methods
    #39649417
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovТаким образом, комитет по стандартизации озадачился проблемой настолько, что таблица виртуальных методов специальном образом "хачится" в конструкторах/деструкторах, чтобы, не дай бог, не дёрнуть метод из иерархии предков.Только не таблица, а указатель на эту таблицу - первый элемент экземпляра класса, на который указывает this. Сама таблица может преспокойно жить в read-only памяти. Иными словами, перед вызовом конструктора/деструктора компилятор вставляет код, меняющий указатель на таблицу виртуальных методов соответствующего класса.
...
Рейтинг: 0 / 0
virtual methods
    #39649420
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov....таблица виртуальных методов специальном образом "хачится" в конструкторах/деструкторах, чтобы, не дай бог, не дёрнуть метод из иерархии предков....

есть подозрение, что "хачить" ее приходится по причине множественного наследования (где AFAIK тоже есть слова virtual для предков)

rdb_dev....Иными словами, перед вызовом конструктора/деструктора компилятор вставляет код, меняющий указатель на таблицу виртуальных методов соответствующего класса.

Спасибо. Лично я таких подробностей не знал.
...
Рейтинг: 0 / 0
virtual methods
    #39649427
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для множественного наследования есть более-менее нетривиальные правила, которые можно запомнить и научиться применять: в конце-концов, мы знаем, на что идём.

Для виртуальных методов в конструкторах/деструкторах "знать" - просто невозможно.
Или вы будете работать с полусозданными (полуразрушенными) объектами или вы изменяете механизм виртуализации вызова методов в конструкторах и деструкторах.

Комитет выбрал второй вариант, хотя для этого разработчикам компиляторов приходится добавлять в конструкторы и деструкторы больше служебного кода.
...
Рейтинг: 0 / 0
virtual methods
    #39649431
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevСпасибо. Лично я таких подробностей не знал.Проверяется несложно - выставляются точки останова в конструкторах и деструкторах по всей иерархии наследования, а в отладчике выставляется наблюдение за (size_t)*this
...
Рейтинг: 0 / 0
virtual methods
    #39649435
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov, ну ведь кто-то должен проинициализировать указатель на vmt. Вот он в конструкторе и инициализируется. Тут все вполне логично. Сконструировали предков, выставили адрес vmt, потом выполнили пользовательский код.
В деструкторе да, повторное выставление этого указателя - как бы "лишний" код. Ну тут видимо по соображениям симметрии.
...
Рейтинг: 0 / 0
virtual methods
    #39649436
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovКомитет выбрал второй вариант, хотя для этого разработчикам компиляторов приходится добавлять в конструкторы и деструкторы больше служебного кода.Я тебе больше скажу - некоторые компиляторы добавляют в таблицу виртуальных методов указатели на служебные ВИРТУАЛЬНЫЕ конструкторы. :)
...
Рейтинг: 0 / 0
virtual methods
    #39649460
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BarloneBasil A. Sidorov, ну ведь кто-то должен проинициализировать указатель на vmt. Вот он в конструкторе и инициализируется. Тут все вполне логично.Это всё понятно.

Просто мои наивные представления предполагали, что таблица виртуальных методов будет инициализирована по итоговому (создаваемому) типу - это минимум кода и, соответственно, минимум телодвижений.
Если в конструкторах/деструкторах не используются виртуальные методы - этого вполне достаточно.

Но, видимо, эстеты от программирования представляют достаточную опасность, чтобы в стандарте заложились на максимально безопасное поведение, не ограничиваясь простым предупреждением о неопределённом поведении.
...
Рейтинг: 0 / 0
virtual methods
    #39649464
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovНо, видимо, эстеты от программирования представляют достаточную опасность, чтобы в стандарте заложились на максимально безопасное поведение, не ограничиваясь простым предупреждением о неопределённом поведении.Потому я и настаиваю на дуракоустойчивой реализации методов, а ты мне - проктостоматология, проктостоматология!...
...
Рейтинг: 0 / 0
virtual methods
    #39649471
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devпроктостоматология, проктостоматология!... У вас есть другое определение для использования виртуальных методах в конструкторах и деструкторах?
...
Рейтинг: 0 / 0
virtual methods
    #39649473
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov, виртуальные методы не причем, если программист сначала пишет delete ptr, а потом ptr->method(), когда ресурсы уже освобождены, а память кучи из под объекта уже выделена на что-то другое.
...
Рейтинг: 0 / 0
virtual methods
    #39649650
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevСпасибо. Лично я таких подробностей не знал.Вот поэтому полезно смотреть, как работает с++ код под ассемблером :)
...
Рейтинг: 0 / 0
virtual methods
    #39650156
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMbВот поэтому полезно смотреть, как работает с++ код под ассемблером :)ага, на каждой версии компилятора, используемого в разработке в текущий момент, искать отличия от предыдущих версий, медитировать над ними... ведь работа не х.., стояла и будет стоять)))
...
Рейтинг: 0 / 0
virtual methods
    #39650218
a guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rdb_devнекоторые компиляторы добавляют в таблицу виртуальных методов указатели на служебные ВИРТУАЛЬНЫЕ конструкторы. :)Может ты с деструкторами путаешь? Принеси пример.
...
Рейтинг: 0 / 0
virtual methods
    #39650439
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вангую что сейчас прозвучит слово борланд ))
...
Рейтинг: 0 / 0
virtual methods
    #39650491
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyВангую что сейчас прозвучит слово борланд ))Не прозвучит, потому что я не помню где наблюдал служебные виртуальные конструкторы. Вполне возможно, что и у Борланда.
...
Рейтинг: 0 / 0
25 сообщений из 356, страница 4 из 15
Форумы / C++ [игнор отключен] [закрыт для гостей] / virtual methods
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]