在销毁派生类对象的过程中,我首先点击派生类析构函数,然后点击基类析构函数(这是预期的)。但我很想知道 - 派生类的功能在什么时候超出范围(被破坏)。
一旦控件离开派生类析构函数并走向基础,它会发生吗?或者,一旦我们完成基类析构函数,它就会发生。
由于
答案 0 :(得分:8)
一旦最派生类的析构函数完成,对象的动态类型可以被认为是下一个派生类型的类型。也就是说,对基础析构函数中的虚方法的调用将发现该时间点的最终覆盖是在基础级别。 (在施工期间发生相反的情况)
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
答案 1 :(得分:4)
功能不会被破坏。
虚拟函数会在派生的析构函数完成后立即删除它们在v表中的条目,因此您无法从基础函数中调用派生的虚函数。