Re[16]: Книжка по UB
От: so5team https://stiffstream.com
Дата: 14.08.25 09:04
Оценка:
Здравствуйте, rg45, Вы писали:

S>>А значит, с формальной точки зрения, виртуальная диспетчеризация работает.


R>Ну, это никак не проверяется через поведение программы. Результаты же идентичны.


Почему не проверяется? Согласно стандарту при вызове f() в конструкторе c4 мы получаем вызов наиболее свежей к этому времени версии f -- c2::f.
Значит все работает.

Аналогичная точка зрения у моих "оппонентов" и на ситуацию:
struct c1 {
  ~c1() { f(); }
  virtual void f() { std::cout << "c1::f" << std::endl; }
};

struct c2 : public c1 {};

struct c3 : public c2 {
  void f() override { std::cout << "c3::f" << std::endl; }
};

int main() {
  c3 c;
}

В деструкторе c1 будет вызвана наиболее свежая к этому времени версия f -- c1::f, а не c3::f.
В точности согласно стандарта, а значит все работает как и предписано. А значит все работает.

Т.е. работа "по стандарту" вполне себе проверяется через работу программы.

Вынужден повториться, но проблема здесь не в стандарте или возможности проверить работу согласно стандарта. А в том, что у части пользователей C++ другие ожидания от вызова виртуального метода в конструкторе/деструкторе.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.