Сообщение Re[4]: Книжка по UB от 13.08.2025 12:31
Изменено 13.08.2025 12:36 so5team
Re[4]: Книжка по UB
Здравствуйте, Лазар Бешкенадзе, Вы писали:
ЛБ>Все. Там написано:
ЛБ>
ЛБ>Это чушь. Работает.
Правда что ли? А это тогда как объяснить:
вывод:
Цинк
ЛБ>Все. Там написано:
ЛБ>
В конструкторах и деструкторах в C++ виртуальная диспетчеризация методов не работает
ЛБ>Это чушь. Работает.
Правда что ли? А это тогда как объяснить:
#include <iostream>
class base
{
virtual void f() { std::cout << "base::f" << std::endl; }
public:
base() {
std::cout << "base {" << std::endl;
f();
std::cout << "base }" << std::endl;
}
};
class derived : public base
{
void f() { std::cout << "derived::f" << std::endl; }
public:
derived() {
std::cout << "derived {" << std::endl;
f();
std::cout << "derived }" << std::endl;
}
};
int main()
{
derived d;
}
вывод:
base {
base::f
base }
derived {
derived::f
derived }
Цинк
Re[4]: Книжка по UB
Здравствуйте, Лазар Бешкенадзе, Вы писали:
ЛБ>Все. Там написано:
ЛБ>
ЛБ>Это чушь. Работает.
Правда что ли? А это тогда как объяснить:
вывод:
Цинк
ЗЫ. Для компиляции в режиме C++11 или более свежих стандартов для f нужно поставить override. Я просто в режиме C++98 проверял.
ЛБ>Все. Там написано:
ЛБ>
В конструкторах и деструкторах в C++ виртуальная диспетчеризация методов не работает
ЛБ>Это чушь. Работает.
Правда что ли? А это тогда как объяснить:
#include <iostream>
class base
{
virtual void f() { std::cout << "base::f" << std::endl; }
public:
base() {
std::cout << "base {" << std::endl;
f();
std::cout << "base }" << std::endl;
}
void call_f() {
std::cout << "===" << std::endl;
f();
}
};
class derived : public base
{
void f() { std::cout << "derived::f" << std::endl; }
public:
derived() {
std::cout << "derived {" << std::endl;
f();
std::cout << "derived }" << std::endl;
}
};
int main()
{
derived d;
d.call_f();
}
вывод:
base {
base::f
base }
derived {
derived::f
derived }
===
derived::f
Цинк
ЗЫ. Для компиляции в режиме C++11 или более свежих стандартов для f нужно поставить override. Я просто в режиме C++98 проверял.