powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / virtual methods
25 сообщений из 356, страница 3 из 15
virtual methods
    #39648607
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще-то virtual - это и есть "недо-" "почти" настоящий.
Во всех смыслах которые тут обсуждали.
Поэтому утверждать что в применении к функциям имелось в виду "действительный", "настоящий" - это неверно, потому что смысл там обратный.
На самом деле имелось в виду "недо-функция" - заготовка функции. Это и есть суть виртуальных функций.
...
Рейтинг: 0 / 0
virtual methods
    #39648644
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky, еще "псевдо".
...
Рейтинг: 0 / 0
virtual methods
    #39648671
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TAnatoly Moskovskyпропущено...

Сильно сомневаюсь , что такое значение у этого слова существует ))
Гуглопереводчик говорит что существует

В том-то и ирония, что существует.
И "виртуальная реальность" -- это не "виртуальная", а "действительная", "реальная", т.е.
такая, что почти как настоящая.
...
Рейтинг: 0 / 0
virtual methods
    #39648672
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OoCcВиртуальная Реальность в таком случае Реальная Реальность?

Именно так.
...
Рейтинг: 0 / 0
virtual methods
    #39648678
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devBasil A. Sidorovпропущено...
Встречный вопрос: "Деструктор уже разрушил состояние объекта и вызвал метод объекта - ваши действия?" - не хочется задать?
Или это слишком по еврейски?Такая ситуация называется "сам дурак". :)
Конечно, иногда программер способен и такое ненарочно написать. Бывает... А что будет, если объект разрушен, память от него ушла на другие нужды, а прога вызывает delete по старому указателю, в надежде, что там живой объект? Тут либо всю программу внимательно прошерстить, либо все обычные указатели заменить на смарт.

Между прочим, в таком случае виртуальный метод работает 100%но нормально, как виртуальный.
Например, если в деструкторе потомка будет вызван метод предка, а тот уже вызовет виртуальный метод, переопределённый в том числе в потомке, то будет вызвана реализация из этого потомка.

Так что всё 100% ОК.
...
Рейтинг: 0 / 0
virtual methods
    #39648680
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devПредлагаю переводить слово "virtual", как "мнимый". В этом случае, будем получать точный смысл таких словосочетания, как:
virtual reality (мнимая реальность)
virtual memory (мнимая память - свопинг данных между оперативной памятью и ЖД)
virtual office (мнимый офис - когда работники фиг знает где, но на связи и участвуют в производственном процессе)
VPN
и т.д.

Не получится так просто. Это многозначное слово, и в зависимости от контекста придётся переводить по-разному.
...
Рейтинг: 0 / 0
virtual methods
    #39648682
semen.s.semen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще насколько я понимаю в супер скоростных проектах идет отказ от исключений и виртуальных методов
...
Рейтинг: 0 / 0
virtual methods
    #39648684
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyВообще-то virtual - это и есть "недо-" "почти" настоящий.
Во всех смыслах которые тут обсуждали.
Поэтому утверждать что в применении к функциям имелось в виду "действительный", "настоящий" - это неверно, потому что смысл там обратный.
На самом деле имелось в виду "недо-функция" - заготовка функции. Это и есть суть виртуальных функций.

С чего ты это вот выдумал -- не понятно. Чем это она недо функция? Чем она заготовка ?

Суть виртуальной функции в том, что вызывается реализация исходя из динамического, реального типа данного объекта, а не в соответствии с лексическим типом объектной переменной. Т.е. вызывается ДЕЙСТВИТЕЛЬНАЯ реализация метода.
...
Рейтинг: 0 / 0
virtual methods
    #39648685
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
semen.s.semenВообще насколько я понимаю в супер скоростных проектах идет отказ от исключений и виртуальных методов

Ты понимаешь неверно.
...
Рейтинг: 0 / 0
virtual methods
    #39648687
semen.s.semen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivsemen.s.semenВообще насколько я понимаю в супер скоростных проектах идет отказ от исключений и виртуальных методов

Ты понимаешь неверно.

Поясни
...
Рейтинг: 0 / 0
virtual methods
    #39648690
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivЧем это она недо функция? Чем она заготовка ?
Потому что где-то там, и позже (в рантайме), будет предоставлена реализация этой функции.
А само объявление где указано virtual не является реализацией, а всего лишь заготовкой.
...
Рейтинг: 0 / 0
virtual methods
    #39648696
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
semen.s.semenMasterZivпропущено...


Ты понимаешь неверно.

Поясни

В отдельном топике.
...
Рейтинг: 0 / 0
virtual methods
    #39648702
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyА само объявление где указано virtual не является реализацией, а всего лишь заготовкой.

Оно (объявление) может быть в том числе и реализацией. Так что не понятно.
Ну ладно, это не очень важно, у каждого в голове своя модель языка, главное, чтобы написанная по этой модели программа соответствовала стандарту, а сама модель не важна.
...
Рейтинг: 0 / 0
virtual methods
    #39648709
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyMasterZivЧем это она недо функция? Чем она заготовка ?
Потому что где-то там, и позже (в рантайме), будет предоставлена реализация этой функции.
А само объявление где указано virtual не является реализацией, а всего лишь заготовкой.Кстати да! Потому как то, что называется "чисто мнимыми методами" (pure virtual methods) не имеет реализации изначально, а используются для описания интерфейсной части класса и должны иметь реализацию в инстанцирующимся потомке.
...
Рейтинг: 0 / 0
virtual methods
    #39648725
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devAnatoly Moskovskyпропущено...

Потому что где-то там, и позже (в рантайме), будет предоставлена реализация этой функции.
А само объявление где указано virtual не является реализацией, а всего лишь заготовкой.Кстати да! Потому как то, что называется "чисто мнимыми методами" (pure virtual methods) не имеет реализации изначально, а используются для описания интерфейсной части класса и должны иметь реализацию в инстанцирующимся потомке.

Это тоже не так.
pure virtual может иметь реализацию (и имеет её всегда даже если ты её не определяешь в коде).
Вы просто плохо знаете язык С++.
(я тоже фигово, не обольщайтесь)
...
Рейтинг: 0 / 0
virtual methods
    #39648742
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivОно (объявление) может быть в том числе и реализацией. Так что не понятно.
А где я сказал что не может быть реализации по умолчанию?
Но это не отменяет того что для виртуальных функций подразумевается отдельная реализация, которой в общем случае не существует на момент компиляции программы. Именно в этом их суть.
...
Рейтинг: 0 / 0
virtual methods
    #39649102
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devТакая ситуация называется "сам дурак". :)Позанудствую. Такая ситуация, да, "сам дурак" (чё я на собеседовании и сказал, но мягше).

Но речь шла про деструктор.

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

MasterZivВы просто плохо знаете язык С++.
(я тоже фигово, не обольщайтесь)Что же ты, Оби Ван, ты был нашей единственной надеждой!
...
Рейтинг: 0 / 0
virtual methods
    #39649112
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMbДеструктор сам объект не разрушает, это просто метод, вызываемый перед разрушением объекта, чтобы обслужить данные внутри объекта перед разрушением. Вызывать (виртуальные) методы внутри деструктора можно, если они не используют данные объекта, уже разрушенные в этом или других деструкторах.

Результат вызова виртуального метода внутри деструктора зависит от того, в каком именно деструкторе он вызван...
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
#include <iostream>

struct a {
  virtual void m() { std::cout << "a::m\n"; }
  void n() { m(); }
  virtual ~a() { n(); }
};

struct b : public a {
  virtual ~b() { n(); }
};

struct c : public b {
  virtual void m() { std::cout << "c::m\n"; }
  virtual ~c() { n(); }
};

int main() {
 a *p = new c();
 delete p;
 return 0;
}

Сначала вызывается деструктор потомка, и в нем вызывается виртуальный метод потомка. Затем вызывается деструктор предка, потомок уже разрушен, и тут вызывается метод предка.
...
Рейтинг: 0 / 0
virtual methods
    #39649174
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BarloneCEMbДеструктор сам объект не разрушает, это просто метод, вызываемый перед разрушением объекта, чтобы обслужить данные внутри объекта перед разрушением. Вызывать (виртуальные) методы внутри деструктора можно, если они не используют данные объекта, уже разрушенные в этом или других деструкторах.
Сначала вызывается деструктор потомка, и в нем вызывается виртуальный метод потомка. Затем вызывается деструктор предка, потомок уже разрушен, и тут вызывается метод предка.Поверь мне на слово, CEMb совершенно верно написал, что никакого разрушения реально не происходит - после вызова деструктора потомка, память под экземпляром класса не освобождается и деструктор предка абсолютно нормально отработает. Иными словами, объект вполне живой до тех пор, пока не отработают все деструкторы и память не будет освобождена. Задача деструктора - освободить захваченные конструктором ресурсы, но не надо освобождать деструктором конкретного класса то, что не захватывал его конструктор или методы, т.е., если конструктор или методы предка захватили память из кучи и в деструкторе предка есть реализация освобождения этих ресурсов, деструктор потомка не должен эти ресурсы освобождать, хотя и может, если соответствующие члены класса доступны ему через protected или friendly.
...
Рейтинг: 0 / 0
virtual methods
    #39649193
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devникакого разрушения реально не происходит - после вызова деструктораКроме синтаксиса есть ещё и семантика.

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

Проблема, разумеется, не зависит от виртуальности метода.
Но! Виртуальность добавляет сложности с пониманием того, какой именно из цепочки наследования виртуальных методов будет вызван и в каком состоянии к этому времени находится объект.

Разумеется, "погромист семи пядей во лбу" (а кто тут не умный?) всё сделает правильно, но, вроде как, промышленное программирование предполагает создание сопровождаемого кода, а не кабаллистических заклинаний.

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

Проблема, разумеется, не зависит от виртуальности метода.
Но! Виртуальность добавляет сложности с пониманием того, какой именно из цепочки наследования виртуальных методов будет вызван и в каком состоянии к этому времени находится объект.Не вижу проблемы! Освободи ресурс, задай хэндлу что-то типа INVALID_HANDLE_VALUE и проверяй его в методах.
...
Рейтинг: 0 / 0
virtual methods
    #39649264
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devНе вижу проблемы!"... но умище-то я куда дену?"Освободи ресурс, задай хэндлу что-то типа INVALID_HANDLE_VALUE и проверяй его в методах."А вы на шкаф залезьте".
Не решаются, как известно, только три проблемы: смерть, налоги и желание иметь более быстрый компьютер.
Тем не менее, некоторые проблемы лучше просто не создавать .
...
Рейтинг: 0 / 0
virtual methods
    #39649270
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovНе решаются, как известно, только три проблемы: смерть, налоги и желание иметь более быстрый компьютер.
Тем не менее, некоторые проблемы лучше просто не создавать .Естественно! Поэтому, если программист написал delete с указателем на объект, а затем дёрнул метод этого объекта, то он сам создал себе проблему. Иными словами, опять получаем ситуацию "сам дурак".

Ко всему прочему, если ты создаешь экземпляр класса с каким-то public или protected методом, использующим HANDLE из private члена этого класса, то должен быть готов к тому, что кто-то, наследуя этот класс, создаст себе проблему "сам дурак" и подумать о дуракоустойчивости своей реализации, реализовав в этом методе проверку значения хэндла, а в деструкторе инициализацию хэндла в INVALID_HANDLE_VALUE после закрытия ресурса. Это нормальная практика!
...
Рейтинг: 0 / 0
virtual methods
    #39649299
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devЭто нормальная практика!Нормальная практика исключает использование виртуальных методов и в конструкторах и в деструкторах.
А вы пишите о началах проктостоматологии: "Посмотрите, как легко и непринуждённо мы подвесим у себя над головой пудовую гирю, создав несложный абажур из обычных швейных ниток!"
...
Рейтинг: 0 / 0
virtual methods
    #39649304
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorovrdb_devЭто нормальная практика!Нормальная практика исключает использование виртуальных методов и в конструкторах и в деструкторах.
А вы пишите о началах проктостоматологии: "Посмотрите, как легко и непринуждённо мы подвесим у себя над головой пудовую гирю, создав несложный абажур из обычных швейных ниток!"
Мне это не очень понятно.

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

Запрет на вызов виртуальных методов в конструкторе/диструкторе/виртуальном диструкторе.... для меня как-то совсем не очевиден. А если у меня достаточно сложный алгоритм инициализации/убийства и я хочу дать возможность в потомках переопределить поведение "в середине" данного алгоритма? Если без виртуальных методов, то это только переопределять целиком конструктор/диструктор и copy-past... ерунда какая-то получается.
...
Рейтинг: 0 / 0
25 сообщений из 356, страница 3 из 15
Форумы / C++ [игнор отключен] [закрыт для гостей] / virtual methods
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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