【发布时间】:2011-03-09 13:09:14
【问题描述】:
在销毁派生类对象期间,我首先点击派生类析构函数,然后是基类析构函数(正如预期的那样)。但我很想知道——派生类的函数在什么时候超出范围(被销毁)。
当控件离开派生类析构函数并进入基类时是否会发生这种情况?还是在我们完成基类析构函数后也会发生这种情况。
谢谢
【问题讨论】:
标签: c++ oop visual-c++ c++11
在销毁派生类对象期间,我首先点击派生类析构函数,然后是基类析构函数(正如预期的那样)。但我很想知道——派生类的函数在什么时候超出范围(被销毁)。
当控件离开派生类析构函数并进入基类时是否会发生这种情况?还是在我们完成基类析构函数后也会发生这种情况。
谢谢
【问题讨论】:
标签: c++ oop visual-c++ c++11
一旦最派生类的析构函数完成,对象的动态类型可以被认为是下一个派生较少的类型。也就是说,在基析构函数中调用虚方法会发现在那个时间点的最终覆盖器处于基层。 (施工时则相反)
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
【讨论】:
函数不会被破坏。
然而,一旦派生的析构函数完成,虚拟函数就会在 v-table 中删除它们的条目,因此您不能从基 d'tor 调用派生的虚拟函数。
【讨论】: