析构函数

豆包啊啊 2008-12-04 02:33:18
class Base
{
public:
Base()
{
cout << "BB";
f();
}
~Base()
{
cout << "~BB";
}
virtual void f()
{
cout << "BF";
}
};
class Derived:public Base
{
public:
Derived()
{
cout << "DD";
}
~Derived()
{
cout << "~DD";
}
void f()
{
cout << "DF";
}
};
int main()
{
Derived d;
Base b;
d.f();
return 0;
}

输出结果是:BBBFDDBBBFDF
为什么没有~BB和~DD?析构函数没有运行么?
还有输出的顺序也没看明白,谁能讲一下啊??
...全文
191 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
kepheus 2008-12-06
  • 打赏
  • 举报
回复
这也是个不错的了解析构函数执行顺序的例子 呵呵 分享一下





#include<iostream.h>

class Test
{
private:
int n;
float f;
public:
Test();
Test(int N,float F);
int getint() {return n;}
float getfloat() {return f;}
~Test();
};
Test::Test()
{
n=0;
f=0.0;
cout<<"\nN="<<n<<"\nF="<<f<<endl;
}
Test::Test(int N,float F)
{
n=N;
f=F;
cout<<"\nN="<<n<<"\nF="<<f<<endl;
}
Test:: ~Test()
{
cout<<"\n Destructor is active. \n";
}
void main()
{


cout<<"\n……Entering main……\n";
Test x;
Test (10, 20.5);
cout<<"\n……Exiting main……\t";
}
kepheus 2008-12-06
  • 打赏
  • 举报
回复
构造是顺序的 析构是构造的倒续
xxgamexx 2008-12-06
  • 打赏
  • 举报
回复
很多人都回答了问题

楼主这样的结贴方式,将来也可能只会有一个人来回答楼主的问题了~~
toadzw 2008-12-04
  • 打赏
  • 举报
回复
BB
BF
DD
BB
BF
DF
~BB
~DD
~BB

没有问题啊
l176266956 2008-12-04
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 jicy_luo 的回复:]
VC6下的结果:
BB
BF
DD
BB
BF
DF
~BB
~DD
~BB

没有问题啊!

至于调用析构函数的顺序问题跟变量声明的位置有关(函数局部变脸的入栈顺序有关),越后声明的越先释放,于是有了如上结果!
[/Quote]
UP
nullah 2008-12-04
  • 打赏
  • 举报
回复

环境:vs2005
output:
BBBFDDBBBFDF~BB~DD~BB请按任意键继续. . .
longpeng030704 2008-12-04
  • 打赏
  • 举报
回复
输出没问题

构造先父在子,析构与构造相反


这就是C++的不同,好多东西实际上都是在里面执行了 表面上看不到
luojc714 2008-12-04
  • 打赏
  • 举报
回复
VC6下的结果:
BB
BF
DD
BB
BF
DF
~BB
~DD
~BB

没有问题啊!

至于调用析构函数的顺序问题跟变量声明的位置有关(函数局部变脸的入栈顺序有关),越后声明的越先释放,于是有了如上结果!
luojc714 2008-12-04
  • 打赏
  • 举报
回复
VC6下的结果:
BB
BF
DD
BB
BF
DF
~BB
~DD
~BB

没有问题啊!
luckyvan 2008-12-04
  • 打赏
  • 举报
回复
.net 2005的输出:
BBBFDDBBBFDF~BB~DD~BB请按任意键继续. . .

符合声明的顺序,不知道楼主的那个编译器咋回事
xxgamexx 2008-12-04
  • 打赏
  • 举报
回复
先构造父类 --------》 自身变量 ------------》自身构造函数
kkndciapp 2008-12-04
  • 打赏
  • 举报
回复
有析构输出
herman~~ 2008-12-04
  • 打赏
  • 举报
回复
构造先 父类-》子类
析构 子类-》父类
visame 2008-12-04
  • 打赏
  • 举报
回复
为什么没有~BB和~DD?

应该有。否则就是编译器的问题。
JoySH 2008-12-04
  • 打赏
  • 举报
回复
BB
BF
DDBB
BF
DF
~BB >>>>> 为Base b; 调用析构函数;
~DD~BB >>>>> 为Derived d; 调用析构函数
(先调用d 析构函数,所以输出~DD,然后父类的析构函数,输出~BB。调用顺序和构造函数相反)
  • 打赏
  • 举报
回复
还有输出的顺序也没看明白,谁能讲一下啊??

Derived d;
先运行父类构造函数,所以输出BBBF,然后d的构造函数,输出DD。
Base b;
再输出BBBF
d.f();
DF
hhyttppd 2008-12-04
  • 打赏
  • 举报
回复
LZ不会睡眠不足,眼晴有点花吧?
VCRWX 2008-12-04
  • 打赏
  • 举报
回复
首先我要提示你<<之间是没有空格的.如果你把空格去掉,~BB和~DD是一定回输出的,为了更明显的看到结果,你可以写成
cout<<"XXXXX"<<endl;的型式

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧