C++,析构函数不执行,对象也能删掉吧?
classanimal{public:animal(){}virtualvoidspeak(){cout<<"animal"<<endl;}~animal(){cout<...
class animal
{
public:
animal(){}
virtual void speak(){cout<<"animal"<<endl;}
~animal(){cout<<"111";}
};
class bird : public animal
{
public:
void speal(){cout<<"bird"<<endl;}
~bird(){cout<<"ddd";}
};
void main()
{
animal *p=new bird;
delete p;
int PPP; cin>>PPP;
}Bird类的析构函数,好像没执行啊没执行析构函数。那部分也能删除吧? 展开
{
public:
animal(){}
virtual void speak(){cout<<"animal"<<endl;}
~animal(){cout<<"111";}
};
class bird : public animal
{
public:
void speal(){cout<<"bird"<<endl;}
~bird(){cout<<"ddd";}
};
void main()
{
animal *p=new bird;
delete p;
int PPP; cin>>PPP;
}Bird类的析构函数,好像没执行啊没执行析构函数。那部分也能删除吧? 展开
4个回答
2013-07-05
展开全部
首先,析构函数的执行与否与对象能否被销毁是要看你析构函数里的内容,上题的析构函数就并不影响指针p的销毁,因为你已经在创建了指针后手动销毁它了(delete),如果把delete p写在析构函数里的话,那么这个析构函数就直接影响到了对象的销毁。 需要指出的一点是析构函数一定会执行的,它在程序执行完以后自动调用,上题你输入了一个整型后(如上题的111),敲回车,应该显示:111,ddd,111。
2013-07-05
展开全部
通过设置断点调试,发现bird类的析构函数确实没有执行,但是bird类的构造函数是被执行了的,楼主一定觉得很奇怪,我也觉得很奇怪。但是仔细一分析确实没有错,因为你用基类的指针去开辟了一个子类的空间,开辟空间相当于构造了一个子类。然而此指针是基类指针,所以在delete p的时候只会执行基类的析构函数,而子类的析构函数由于没有释放空间而不会被执行。解决的办法是在基类的析构函数前面加上virtual,让析构函数变成虚函数,这样子类由于继承了基类,所以析构函数同样会被继承,自然就会执行了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2013-07-05
展开全部
对象销毁时, 才会执行。。。你屏幕当前状态,main函数还没退出呢,当然你看不到执行。void m()
{
animal *p=new bird;
delete p;
int PPP; cin>>PPP;
}void main(){ m(); getch();}这样试下结果如何?
{
animal *p=new bird;
delete p;
int PPP; cin>>PPP;
}void main(){ m(); getch();}这样试下结果如何?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2013-07-05
展开全部
bird 又没建立对象,怎么会执行析构函数呢 又何谈调用
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询