Как только деструктор самого производного класса заканчивается, динамический тип объекта может считаться типом следующего менее производного типа. То есть вызов виртуального метода в базовом деструкторе обнаружит, что окончательный переопределитель в этот момент времени находится на базовом уровне. (Происходит обратное во время строительства)
struct base {
base() { std::cout << type() << std::endl; }
virtual ~base() { std::cout << type() << std::endl; }
virtual std::string type() const {
return "base";
}
};
struct derived : base {
virtual std::string type() const {
return "derived";
}
};
int main() {
base *p = new derived;
std::cout << p->type() << std::endl;
delete p;
}
// output:
// base
// derived
// base