|
virtual methods
|
|||
---|---|---|---|
#18+
Вообще-то virtual - это и есть "недо-" "почти" настоящий. Во всех смыслах которые тут обсуждали. Поэтому утверждать что в применении к функциям имелось в виду "действительный", "настоящий" - это неверно, потому что смысл там обратный. На самом деле имелось в виду "недо-функция" - заготовка функции. Это и есть суть виртуальных функций. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2018, 12:36 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Anatoly Moskovsky, еще "псевдо". ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2018, 13:14 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Dima TAnatoly Moskovskyпропущено... Сильно сомневаюсь , что такое значение у этого слова существует )) Гуглопереводчик говорит что существует В том-то и ирония, что существует. И "виртуальная реальность" -- это не "виртуальная", а "действительная", "реальная", т.е. такая, что почти как настоящая. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2018, 13:35 |
|
virtual methods
|
|||
---|---|---|---|
#18+
OoCcВиртуальная Реальность в таком случае Реальная Реальность? Именно так. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2018, 13:36 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_devBasil A. Sidorovпропущено... Встречный вопрос: "Деструктор уже разрушил состояние объекта и вызвал метод объекта - ваши действия?" - не хочется задать? Или это слишком по еврейски?Такая ситуация называется "сам дурак". :) Конечно, иногда программер способен и такое ненарочно написать. Бывает... А что будет, если объект разрушен, память от него ушла на другие нужды, а прога вызывает delete по старому указателю, в надежде, что там живой объект? Тут либо всю программу внимательно прошерстить, либо все обычные указатели заменить на смарт. Между прочим, в таком случае виртуальный метод работает 100%но нормально, как виртуальный. Например, если в деструкторе потомка будет вызван метод предка, а тот уже вызовет виртуальный метод, переопределённый в том числе в потомке, то будет вызвана реализация из этого потомка. Так что всё 100% ОК. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2018, 13:40 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_devПредлагаю переводить слово "virtual", как "мнимый". В этом случае, будем получать точный смысл таких словосочетания, как: virtual reality (мнимая реальность) virtual memory (мнимая память - свопинг данных между оперативной памятью и ЖД) virtual office (мнимый офис - когда работники фиг знает где, но на связи и участвуют в производственном процессе) VPN и т.д. Не получится так просто. Это многозначное слово, и в зависимости от контекста придётся переводить по-разному. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2018, 13:41 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Вообще насколько я понимаю в супер скоростных проектах идет отказ от исключений и виртуальных методов ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2018, 13:41 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Anatoly MoskovskyВообще-то virtual - это и есть "недо-" "почти" настоящий. Во всех смыслах которые тут обсуждали. Поэтому утверждать что в применении к функциям имелось в виду "действительный", "настоящий" - это неверно, потому что смысл там обратный. На самом деле имелось в виду "недо-функция" - заготовка функции. Это и есть суть виртуальных функций. С чего ты это вот выдумал -- не понятно. Чем это она недо функция? Чем она заготовка ? Суть виртуальной функции в том, что вызывается реализация исходя из динамического, реального типа данного объекта, а не в соответствии с лексическим типом объектной переменной. Т.е. вызывается ДЕЙСТВИТЕЛЬНАЯ реализация метода. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2018, 13:43 |
|
virtual methods
|
|||
---|---|---|---|
#18+
semen.s.semenВообще насколько я понимаю в супер скоростных проектах идет отказ от исключений и виртуальных методов Ты понимаешь неверно. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2018, 13:44 |
|
virtual methods
|
|||
---|---|---|---|
#18+
MasterZivsemen.s.semenВообще насколько я понимаю в супер скоростных проектах идет отказ от исключений и виртуальных методов Ты понимаешь неверно. Поясни ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2018, 13:44 |
|
virtual methods
|
|||
---|---|---|---|
#18+
MasterZivЧем это она недо функция? Чем она заготовка ? Потому что где-то там, и позже (в рантайме), будет предоставлена реализация этой функции. А само объявление где указано virtual не является реализацией, а всего лишь заготовкой. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2018, 13:48 |
|
virtual methods
|
|||
---|---|---|---|
#18+
semen.s.semenMasterZivпропущено... Ты понимаешь неверно. Поясни В отдельном топике. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2018, 13:51 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Anatoly MoskovskyА само объявление где указано virtual не является реализацией, а всего лишь заготовкой. Оно (объявление) может быть в том числе и реализацией. Так что не понятно. Ну ладно, это не очень важно, у каждого в голове своя модель языка, главное, чтобы написанная по этой модели программа соответствовала стандарту, а сама модель не важна. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2018, 13:53 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Anatoly MoskovskyMasterZivЧем это она недо функция? Чем она заготовка ? Потому что где-то там, и позже (в рантайме), будет предоставлена реализация этой функции. А само объявление где указано virtual не является реализацией, а всего лишь заготовкой.Кстати да! Потому как то, что называется "чисто мнимыми методами" (pure virtual methods) не имеет реализации изначально, а используются для описания интерфейсной части класса и должны иметь реализацию в инстанцирующимся потомке. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2018, 13:56 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_devAnatoly Moskovskyпропущено... Потому что где-то там, и позже (в рантайме), будет предоставлена реализация этой функции. А само объявление где указано virtual не является реализацией, а всего лишь заготовкой.Кстати да! Потому как то, что называется "чисто мнимыми методами" (pure virtual methods) не имеет реализации изначально, а используются для описания интерфейсной части класса и должны иметь реализацию в инстанцирующимся потомке. Это тоже не так. pure virtual может иметь реализацию (и имеет её всегда даже если ты её не определяешь в коде). Вы просто плохо знаете язык С++. (я тоже фигово, не обольщайтесь) ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2018, 14:10 |
|
virtual methods
|
|||
---|---|---|---|
#18+
MasterZivОно (объявление) может быть в том числе и реализацией. Так что не понятно. А где я сказал что не может быть реализации по умолчанию? Но это не отменяет того что для виртуальных функций подразумевается отдельная реализация, которой в общем случае не существует на момент компиляции программы. Именно в этом их суть. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2018, 14:22 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_devТакая ситуация называется "сам дурак". :)Позанудствую. Такая ситуация, да, "сам дурак" (чё я на собеседовании и сказал, но мягше). Но речь шла про деструктор. Деструктор сам объект не разрушает, это просто метод, вызываемый перед разрушением объекта, чтобы обслужить данные внутри объекта перед разрушением. Вызывать (виртуальные) методы внутри деструктора можно, если они не используют данные объекта, уже разрушенные в этом или других деструкторах. MasterZivВы просто плохо знаете язык С++. (я тоже фигово, не обольщайтесь)Что же ты, Оби Ван, ты был нашей единственной надеждой! ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2018, 06:02 |
|
virtual methods
|
|||
---|---|---|---|
#18+
CEMbДеструктор сам объект не разрушает, это просто метод, вызываемый перед разрушением объекта, чтобы обслужить данные внутри объекта перед разрушением. Вызывать (виртуальные) методы внутри деструктора можно, если они не используют данные объекта, уже разрушенные в этом или других деструкторах. Результат вызова виртуального метода внутри деструктора зависит от того, в каком именно деструкторе он вызван... Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22.
Сначала вызывается деструктор потомка, и в нем вызывается виртуальный метод потомка. Затем вызывается деструктор предка, потомок уже разрушен, и тут вызывается метод предка. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2018, 07:11 |
|
virtual methods
|
|||
---|---|---|---|
#18+
BarloneCEMbДеструктор сам объект не разрушает, это просто метод, вызываемый перед разрушением объекта, чтобы обслужить данные внутри объекта перед разрушением. Вызывать (виртуальные) методы внутри деструктора можно, если они не используют данные объекта, уже разрушенные в этом или других деструкторах. Сначала вызывается деструктор потомка, и в нем вызывается виртуальный метод потомка. Затем вызывается деструктор предка, потомок уже разрушен, и тут вызывается метод предка.Поверь мне на слово, CEMb совершенно верно написал, что никакого разрушения реально не происходит - после вызова деструктора потомка, память под экземпляром класса не освобождается и деструктор предка абсолютно нормально отработает. Иными словами, объект вполне живой до тех пор, пока не отработают все деструкторы и память не будет освобождена. Задача деструктора - освободить захваченные конструктором ресурсы, но не надо освобождать деструктором конкретного класса то, что не захватывал его конструктор или методы, т.е., если конструктор или методы предка захватили память из кучи и в деструкторе предка есть реализация освобождения этих ресурсов, деструктор потомка не должен эти ресурсы освобождать, хотя и может, если соответствующие члены класса доступны ему через protected или friendly. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2018, 09:44 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_devникакого разрушения реально не происходит - после вызова деструктораКроме синтаксиса есть ещё и семантика. Да, объект, со всеми своими полями - жив и здоров. Но, представим себе, что в одном из полей находится описатель (handle) какого-то (не)системного объекта. Деструктор класса, в котором было объявлено это поле, может (обязан) произвести очистку ресуров и вызвать, например, close(). Вызываемый же метод может полагаться на то, что описателем находится в оперативном (открытом) состоянии. Получится нехорошо. Проблема, разумеется, не зависит от виртуальности метода. Но! Виртуальность добавляет сложности с пониманием того, какой именно из цепочки наследования виртуальных методов будет вызван и в каком состоянии к этому времени находится объект. Разумеется, "погромист семи пядей во лбу" (а кто тут не умный?) всё сделает правильно, но, вроде как, промышленное программирование предполагает создание сопровождаемого кода, а не кабаллистических заклинаний. P.S. Вопрос в скобках был риторическим ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2018, 10:01 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Basil A. SidorovДеструктор класса, в котором было объявлено это поле, может (обязан) произвести очистку ресуров и вызвать, например, close(). Вызываемый же метод может полагаться на то, что описатель находится в оперативном (открытом) состоянии. Получится нехорошо. Проблема, разумеется, не зависит от виртуальности метода. Но! Виртуальность добавляет сложности с пониманием того, какой именно из цепочки наследования виртуальных методов будет вызван и в каком состоянии к этому времени находится объект.Не вижу проблемы! Освободи ресурс, задай хэндлу что-то типа INVALID_HANDLE_VALUE и проверяй его в методах. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2018, 10:44 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_devНе вижу проблемы!"... но умище-то я куда дену?"Освободи ресурс, задай хэндлу что-то типа INVALID_HANDLE_VALUE и проверяй его в методах."А вы на шкаф залезьте". Не решаются, как известно, только три проблемы: смерть, налоги и желание иметь более быстрый компьютер. Тем не менее, некоторые проблемы лучше просто не создавать . ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2018, 11:29 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Basil A. SidorovНе решаются, как известно, только три проблемы: смерть, налоги и желание иметь более быстрый компьютер. Тем не менее, некоторые проблемы лучше просто не создавать .Естественно! Поэтому, если программист написал delete с указателем на объект, а затем дёрнул метод этого объекта, то он сам создал себе проблему. Иными словами, опять получаем ситуацию "сам дурак". Ко всему прочему, если ты создаешь экземпляр класса с каким-то public или protected методом, использующим HANDLE из private члена этого класса, то должен быть готов к тому, что кто-то, наследуя этот класс, создаст себе проблему "сам дурак" и подумать о дуракоустойчивости своей реализации, реализовав в этом методе проверку значения хэндла, а в деструкторе инициализацию хэндла в INVALID_HANDLE_VALUE после закрытия ресурса. Это нормальная практика! ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2018, 11:41 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_devЭто нормальная практика!Нормальная практика исключает использование виртуальных методов и в конструкторах и в деструкторах. А вы пишите о началах проктостоматологии: "Посмотрите, как легко и непринуждённо мы подвесим у себя над головой пудовую гирю, создав несложный абажур из обычных швейных ниток!" ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2018, 12:02 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Basil A. Sidorovrdb_devЭто нормальная практика!Нормальная практика исключает использование виртуальных методов и в конструкторах и в деструкторах. А вы пишите о началах проктостоматологии: "Посмотрите, как легко и непринуждённо мы подвесим у себя над головой пудовую гирю, создав несложный абажур из обычных швейных ниток!" Мне это не очень понятно. Описанный Вами сценарий с закрытием файлов - одинаков, что для виртуальных/что для обычных методов. Не говоря уже о том, что это не столько сценарий, сколько описание банальной ошибки (при это даже не кодирования, а скорее documentation баг) Запрет на вызов виртуальных методов в конструкторе/диструкторе/виртуальном диструкторе.... для меня как-то совсем не очевиден. А если у меня достаточно сложный алгоритм инициализации/убийства и я хочу дать возможность в потомках переопределить поведение "в середине" данного алгоритма? Если без виртуальных методов, то это только переопределять целиком конструктор/диструктор и copy-past... ерунда какая-то получается. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2018, 12:08 |
|
|
start [/forum/topic.php?fid=57&msg=39648672&tid=2017692]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
38ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
57ms |
get tp. blocked users: |
1ms |
others: | 16ms |
total: | 156ms |
0 / 0 |