Re[15]: Книжка по UB
От: rg45 СССР  
Дата: 14.08.25 08:55
Оценка:
Здравствуйте, so5team, Вы писали:

S>Тут моя ошибка, нужно было f() описывать в public-части. Давайте считать, что f() доступен для вызова.


Хорошо, исправляем:

http://coliru.stacked-crooked.com/a/bcaa3ac0cf3c2746

class c1 {
public:
  virtual void f() { std::cout << "c1::f" << std::endl; }
};

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

class c3 : public c2 {
  // нет своей версии f().
};

class c4 : public c3 {
public:
  c4() {
      f();      // c2::f
      c2::f();  // c2::f
      c3::f();  // c2::f
      c4::f();  // c2::f
    }
};

int main() {
    c4{};
}


S>Поинт в том, что с точки зрения C++ в конструкторе с4 мы автоматически получаем вызов самой свежей версии f на данный момент.

S>Это происходит за счет того, что С++ корректно модифицирует таблицу виртуальных методов по мере конструирования класса.

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


Ну, это никак не проверяется через поведение программы. Результаты же идентичны.
--
Справедливость выше закона. А человечность выше справедливости.
Отредактировано 14.08.2025 8:57 rg45 . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.