Вызовы виртуальных функций в конструкторе и деструкторе
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
,
То есть во время строительства и разрушения тип объекта, включающего наследование, изменяется! Динамическая отправка организована так, чтобы соответствовать текущему типу объекта.