powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / virtual methods
25 сообщений из 356, страница 5 из 15
virtual methods
    #39650820
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychага, на каждой версии компилятора, используемого в разработке в текущий момент, искать отличия от предыдущих версий, медитировать над ними... ведь работа не х.., стояла и будет стоять)))ну когда-то же учиться надо. Это не 100 лет назад, когда один раз в 16 лет научился быть плотником, и потом 100 лет ничего не меняется. Тут совсем другая кухня, надо мыслить стратегически
День потерял (на изучение новых плюсов) зато потом за 5 минут долетел.
...
Рейтинг: 0 / 0
virtual methods
    #39651008
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMbДень потерял (на изучение новых плюсов) зато потом за 5 минут долетел.для этого стандарт надо читать, или страуструпа, а не в ассемблер лазить.
...
Рейтинг: 0 / 0
virtual methods
    #39651061
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devBarloneпропущено...
Сначала вызывается деструктор потомка, и в нем вызывается виртуальный метод потомка. Затем вызывается деструктор предка, потомок уже разрушен, и тут вызывается метод предка.Поверь мне на слово, CEMb совершенно верно написал, что никакого разрушения реально не происходит - после вызова деструктора потомка, память под экземпляром класса не освобождается и деструктор предка абсолютно нормально отработает. Иными словами, объект вполне живой до тех пор, пока не отработают все деструкторы и память не будет освобождена. Задача деструктора - освободить захваченные конструктором ресурсы, но не надо освобождать деструктором конкретного класса то, что не захватывал его конструктор или методы, т.е., если конструктор или методы предка захватили память из кучи и в деструкторе предка есть реализация освобождения этих ресурсов, деструктор потомка не должен эти ресурсы освобождать, хотя и может, если соответствующие члены класса доступны ему через protected или friendly.

Да, всё так, только "объект вполне живой" -- не совсем верное определение. Точнее, совсем неверное.
У объекта в процессе разрушения меняется тип, он их последнего наследника становится сначала предпоследним, потом пред-предпоследним наследником, и так далее, ... потом -- вторым предком, потом --первым предком, потом только разрушается.

Т.е. объект "умирает" частями, от наследников к родителям. В обратном порядке к такому же "рождению" по частям от родителей к наследникам.

Т.е. "объект вполне живой" -- неверно , определённые подобъекты всего объекта ещё живы, но какие-то подобъекты уже умерли. Для тех, где отработал деструктор уже -- они мертвы, где ещё нет -- являются валидными объектами.
...
Рейтинг: 0 / 0
virtual methods
    #39651063
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devAnatoly MoskovskyВангую что сейчас прозвучит слово борланд ))Не прозвучит, потому что я не помню где наблюдал служебные виртуальные конструкторы. Вполне возможно, что и у Борланда.

Ага, Борланд и Виртуальные Констукторы! ЕЕЕЕ!
У Борланд даже виртуальные статические методы могут быть и даже виртуальные глобальные фукнции!
Я верю всему!
...
Рейтинг: 0 / 0
virtual methods
    #39651092
Фотография ну я
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivrdb_devпропущено...
Не прозвучит, потому что я не помню где наблюдал служебные виртуальные конструкторы. Вполне возможно, что и у Борланда.

Ага, Борланд и Виртуальные Констукторы! ЕЕЕЕ!
У Борланд даже виртуальные статические методы могут быть и даже виртуальные глобальные фукнции!
Я верю всему!
И они для совместимости с раскладкой дельфийских виртуальных конструкторов объявляемых в registered class.
По имени класса в виде строки получаешь описатель класса (указатель на специальный объект) с виртуальными функциями, среди которых функция конструирования экземпляра объекта.
Она в классе класса (в С++ прямого аналога нет) виртуальная, но для экземпляра - конструктор.
Да, и static virtual есть)))) И оно реально есть и работает ))) Для взятия указателя на функцию которая static virtual берется таблица на указатели не от объекта, а от класса класса (то что в дельфи class of). Берем по имени класса описатель, а у него - да, виртуальная функция и она применяется не к экземпляру класса, а к текущему классу, будучи объявленной в базовом классе )))).

Если я чего-то не знаю - это не значит что этого нет. Это значит что я этого не знаю.
...
Рейтинг: 0 / 0
virtual methods
    #39651168
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivДа, всё так, только "объект вполне живой" -- не совсем верное определение. Точнее, совсем неверное.
У объекта в процессе разрушения меняется тип, он их последнего наследника становится сначала предпоследним, потом пред-предпоследним наследником, и так далее, ... потом -- вторым предком, потом --первым предком, потом только разрушается.

Т.е. объект "умирает" частями, от наследников к родителям. В обратном порядке к такому же "рождению" по частям от родителей к наследникам.

Т.е. "объект вполне живой" -- неверно , определённые подобъекты всего объекта ещё живы, но какие-то подобъекты уже умерли. Для тех, где отработал деструктор уже -- они мертвы, где ещё нет -- являются валидными объектами.Так-то оно так, но пока память из под объекта не перевыделена и не перезатёрта, этот "зомби" может казаться вполне живым и даже корректно помахивать невиртуальными членами. :)
...
Рейтинг: 0 / 0
virtual methods
    #39651295
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devТак-то оно так, но пока память из под объекта не перевыделена и не перезатёрта, этот "зомби" может казаться вполне живым и даже корректно помахивать невиртуальными членами. :)только вызвать их при разрушении ( без грязных хаков ) нельзя
...
Рейтинг: 0 / 0
virtual methods
    #39651333
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorych, да ну какие грязные хаки при вызове невиртуальных методов? Просто дёрнуть метод по указателю и всё.
...
Рейтинг: 0 / 0
virtual methods
    #39651439
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychCEMbДень потерял (на изучение новых плюсов) зато потом за 5 минут долетел.для этого стандарт надо читать, или страуструпа, а не в ассемблер лазить.Знания без понимания принципов и механик ведут на тёмную сторону -_-
Когда ты что-то просто знаешь - ты можешь забыть, или перепутать что-то. Когда ты понимаешь принципы действия, ты можешь получить правильные знания в любой момент сам.
...
Рейтинг: 0 / 0
virtual methods
    #39651440
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivДа, всё так, только "объект вполне живой" -- не совсем верное определение. Точнее, совсем неверное.я просто хотел сказать, что в деструкторе надо действовать аккуратно: если (зачем-то) нужно, то обращаться только к тем данным, которые ещё не разрушены.

Кстати, такая же, примерно, ситуация с объектами после std::move - формально их трогать нельзя.
...
Рейтинг: 0 / 0
virtual methods
    #39651441
a guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
CEMbКстати, такая же, примерно, ситуация с объектами после std::move - формально их трогать нельзя.Зачем ты придумываешь всякую ерунду?
...
Рейтинг: 0 / 0
virtual methods
    #39651715
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devegorych, да ну какие грязные хаки при вызове невиртуальных методов? Просто дёрнуть метод по указателю и всё.указатель указывает на тип, в котором нет этих методов, помним об этом? мы в деструкторе предка сейчас.
...
Рейтинг: 0 / 0
virtual methods
    #39651725
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMbКогда ты понимаешь принципы действия, ты можешь получить правильные знания в любой момент сам.принцип действия конструкций языка описан в стандарте, знание конкретной реализации не добавляет ничего нового, кроме ложной уверенности в обладании неким сакральным секретом. Вон, в соседнем топике рубятся уже 3 страницы о смысле инструкции push rax, чем это им помогает в понимании С++ я не знаю))
...
Рейтинг: 0 / 0
virtual methods
    #39651743
Фотография NekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMbКстати, такая же, примерно, ситуация с объектами после std::move - формально их трогать нельзя.
std::move ничего не делает с объектами. А вот move-ctor или move-assignment-operator - да, делают.
...
Рейтинг: 0 / 0
virtual methods
    #39651745
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorych, невиртуальные методы есть всегда. Рассмотри такой вариант:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
struct B;

struct A
{
  virtual ~A();
};

struct B : public A
{
  int m;

  B()
  {
    this->m = -1;
    printf("m = %i\r\n", this->m);
  }

  int set(int src)
  {
    this->m = src;
  }
};

A::~A()
{
  B & b = *reinterpret_cast<B*>(this);
  b.set(0);
  printf("m = %i\r\n", b.m);
}
...
Рейтинг: 0 / 0
virtual methods
    #39651750
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychВон, в соседнем топике рубятся уже 3 страницы о смысле инструкции push rax, чем это им помогает в понимании С++ я не знаю))Где ты в 4-х комментариях три страницы разглядел? Про назначение push rax в примере уже давно выяснили.
...
Рейтинг: 0 / 0
virtual methods
    #39651764
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devegorych, невиртуальные методы есть всегда. Рассмотри такой вариант:
Код: plaintext
1.
2.
3.
4.
5.
6.
A::~A()
{
  B & b = *reinterpret_cast<B*>(this); // а вот и грязный хак
  b.set(0);
  printf("m = %i\r\n", b.m);
}


что будет, если я так напишу, подумай:
Код: plaintext
1.
2.
A *a = new A;
delete a;

??
...
Рейтинг: 0 / 0
virtual methods
    #39651765
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devegorychВон, в соседнем топике рубятся уже 3 страницы о смысле инструкции push rax, чем это им помогает в понимании С++ я не знаю))Где ты в 4-х комментариях три страницы разглядел? Про назначение push rax в примере уже давно выяснили.это был сарказм)))
...
Рейтинг: 0 / 0
virtual methods
    #39651769
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devegorych, невиртуальные методы есть всегда. Рассмотри такой вариант:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
struct B;

struct A
{
  virtual ~A();
};

struct B : public A
{
  int m;

  B()
  {
    this->m = -1;
    printf("m = %i\r\n", this->m);
  }

  int set(int src)
  {
    this->m = src;
  }
};

A::~A()
{
  B & b = *reinterpret_cast<B*>(this);
  b.set(0);
  printf("m = %i\r\n", b.m);
}

Ну да, выстрелить себе в ногу можно всегда. Примерно с тем же успехом можно сделать и так:
Код: plaintext
1.
2.
3.
4.
  double x;
  B & b = *reinterpret_cast<B*>(&x);
  b.set(0);
  printf("m = %i\r\n", b.m);
...
Рейтинг: 0 / 0
virtual methods
    #39651831
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorych
Код: plaintext
1.
2.
3.
4.
5.
6.
A::~A()
{
  B & b = *reinterpret_cast<B*>(this); // а вот и грязный хак
  b.set(0);
  printf("m = %i\r\n", b.m);
}

Это не "грязный", а "чистый" хак. Грязный, это когда ты, например, у экземпляра класса сам меняешь указатель на vtable.

egorychчто будет, если я так напишу, подумай:
Код: plaintext
1.
2.
A *a = new A;
delete a;

??Именно так я и тестировал! Всё прекрасно отработает. :) Ведь деструктор отрабатывает до того, как память будет освобождена.
...
Рейтинг: 0 / 0
virtual methods
    #39651833
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BarloneНу да, выстрелить себе в ногу можно всегда. Примерно с тем же успехом можно сделать и так:
Код: plaintext
1.
2.
3.
4.
  double x;
  B & b = *reinterpret_cast<B*>(&x);
  b.set(0);
  printf("m = %i\r\n", b.m);

Речь не о суициде, а о том, что по типизированному указателю невиртуальные методы работают при любых обстоятельствах.
...
Рейтинг: 0 / 0
virtual methods
    #39651846
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devИменно так я и тестировал! Всё прекрасно отработает. :)
Жесть
...
Рейтинг: 0 / 0
virtual methods
    #39651859
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Barlone, кстати, твой пример прекрасно будет работать, если вручную выставить указатель на vtable.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
  typedef void (B::* B_func)();
  B * tmp = new B();
  B_func* vtbl = *reinterpret_cast<B_func**>(tmp);
  delete tmp;

  double x;
  *reinterpret_cast<B_func**>(&x) = vtbl;
  B & b = *reinterpret_cast<B*>(&x);
  b.set(0);
  printf("m = %i\r\n", b.m);
...
Рейтинг: 0 / 0
virtual methods
    #39651875
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Забыл дописать - на x86_32 при выравнивании структур на 4 байта.
...
Рейтинг: 0 / 0
virtual methods
    #39651990
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovskyrdb_devИменно так я и тестировал! Всё прекрасно отработает. :)
ЖестьАга! Только класс был не "A", а "B".
...
Рейтинг: 0 / 0
25 сообщений из 356, страница 5 из 15
Форумы / C++ [игнор отключен] [закрыт для гостей] / virtual methods
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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