Сообщение Re[15]: Книжка по UB от 14.08.2025 8:55
Изменено 14.08.2025 8:57 rg45
Re[15]: Книжка по UB
Здравствуйте, so5team, Вы писали:
S>Тут моя ошибка, нужно было f() описывать в public-части. Давайте считать, что f() доступен для вызова.
http://coliru.stacked-crooked.com/a/bcaa3ac0cf3c2746
S>Поинт в том, что с точки зрения C++ в конструкторе с4 мы автоматически получаем вызов самой свежей версии f на данный момент.
S>Это происходит за счет того, что С++ корректно модифицирует таблицу виртуальных методов по мере конструирования класса.
S>А значит, с формальной точки зрения, виртуальная диспетчеризация работает.
Ну, это никак не проверяется через поведение программы. Результаты же идентичны.
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>А значит, с формальной точки зрения, виртуальная диспетчеризация работает.
Ну, это никак не проверяется через поведение программы. Результаты же идентичны.
Re[15]: Книжка по UB
Здравствуйте, so5team, Вы писали:
S>Тут моя ошибка, нужно было f() описывать в public-части. Давайте считать, что f() доступен для вызова.
Хорошо, исправляем:
http://coliru.stacked-crooked.com/a/bcaa3ac0cf3c2746
S>Поинт в том, что с точки зрения C++ в конструкторе с4 мы автоматически получаем вызов самой свежей версии f на данный момент.
S>Это происходит за счет того, что С++ корректно модифицирует таблицу виртуальных методов по мере конструирования класса.
S>А значит, с формальной точки зрения, виртуальная диспетчеризация работает.
Ну, это никак не проверяется через поведение программы. Результаты же идентичны.
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>А значит, с формальной точки зрения, виртуальная диспетчеризация работает.
Ну, это никак не проверяется через поведение программы. Результаты же идентичны.