Вызовы виртуальных функций в конструкторе и деструкторе

    class Base
    {
    public:
        Base(){Foo();}
        ~Base(){Foo();}
        virtual void Foo(){std::cout<<"base";}
    };

    class Derived: public Base
    {
    public:
        Derived(){Foo();}
        ~Derived(){Foo();}
        void Foo(){std::cout<<"derived";}
    };

      //main
     {
         Derived d;
     }

Любая идея, почему этот код печатает "базовый" и "производный"?
Я понимаю, что совет заключается не в том, чтобы помещать вызовы виртуальных функций внутри конструктора или дескриптора, я просто хочу знать, почему приведенный выше код будет работать. Спасибо

1 ответ

Во время выполнения конструктора класса Cпроизводные подобъекты еще не построены. Таким образом, динамический тип строящегося объекта является статическим типом конструктора, т.е. C, любой virtual функция будет отправлена ​​так, как будто объект типа C, Аналогично, когда объект производного типа уничтожается и деструктор C выполняется, все производные подобъекты уже уничтожены, и, опять же, тип ведет себя так, как будто он имеет тип C,

То есть во время строительства и разрушения тип объекта, включающего наследование, изменяется! Динамическая отправка организована так, чтобы соответствовать текущему типу объекта.

Другие вопросы по тегам