Re[4]: Книжка по UB
От: rg45 СССР  
Дата: 13.08.25 12:50
Оценка:
Здравствуйте, Лазар Бешкенадзе, Вы писали:

ЛБ>

В конструкторах и деструкторах в C++ виртуальная диспетчеризация методов не работает


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


ЛБ>Единственная проблема в приведенном коде — вызов чисто виртуальной функции в ctor/dtor. Убери в этом коде =0 при описании виртуальных функций и их можно вызывать в ctor/dtor.


Вызвать-то можно, весь вопрос только в том, что из этого получится. Некоторые ошибочно ожидают, что будет вызвана версия виртуальной функции из наследника, а вызвается либо собственная, либо вообще версия из базового класса, если собственной не предоставлено. Этим же объясняется, почему вообще возможeн pure virtual call.

https://coliru.stacked-crooked.com/a/4b8b034cd0190879

#include <iostream>
#include <memory>

class Base
{
public:

    virtual void Stop() { std::cout << "Base::Stop" << std::endl; }
    virtual ~Base() { 
        Stop(); // Вот здесь будет вызван Base::Stop, а не Derived::Stop, как некоторые ожидают.
    }
};

class Derived : public Base
{
public:
    virtual void Stop() { std::cout << "Derived::Stop" << std::endl; }
};

int main() {
    std::shared_ptr<Derived> derived_ptr = std::make_shared<Derived>();
    // При выходе: "Base::stop"
}
--
Справедливость выше закона. А человечность выше справедливости.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.