Информация об изменениях

Сообщение 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++ виртуальная диспетчеризация методов не работает


ЛБ>Это чушь. Работает.


Правда что ли? А это тогда как объяснить:
#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 проверял.