64,637
社区成员
发帖
与我相关
我的任务
分享
#include <iostream>
using namespace std;
class Base {
public:
virtual~Base();
};
Base::~Base(){
cout<<"Base destructor "<<endl;
}
class Derived :public Base {
public:
Derived ();
~Derived();
private:
int *p;
};
Derived::Derived(){
p=new int(0);
}
Derived::~Derived(){
cout<<"Derived destructor "<<endl;
delete p;
}
void fun(Base*b){
delete b;
}
int main(){
Base *b=new Derived ();
fun(b);
return 0;
}
参考:http://blog.csdn.net/songthin/article/details/1703966 new分三步:动态开辟空间,调用构造函数,返回对应指针 因为~Drived()只析构子类的部分,还要~Base()来析构继承父类的部分.和构造函数正好顺序相反。
没有virtual,是按照指针的类型来析构,在这个多态的例子中,是析构~Base()而不析构~Derived() 有virtual,是按照指针指向的对象类型来析构,这个例子中是析构~Derived() 对于派生类来说,析构是从自己往基类一层层析构的,所以还会析构~Base() 你可以去掉基类析构的virtual再运行,结果只会有 Base destructor
析构顺序和你的构造顺序相反