派生类的析构函数先后问题

走好每一步 2008-10-13 02:11:17
#include <iostream>
using namespace std;

class CA{
public:
CA() { cout << "A's constructed.\n"; }
void fun() { cout << "I am A\n"; }
~CA() {cout << "A's destructed.\n"; }
};
class CB:public CA{
public:
CB() { cout << "B's constructed.\n"; }
void fun() { cout << "I am B\n"; }
~CB() {cout << "B's destructed.\n"; }
};
int main(){
CA * p_a;
p_a = new CB;
delete p_a;
return 0;
}

结果:
A's constructed.
B's constructed.
A's destructed.


不明白,为什么只有A被析构,B呢
...全文
362 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
madchemist 2012-07-01
  • 打赏
  • 举报
回复
这种delete会造成内存泄露的,没有释放CB类成员所占用的空间。析构函数不是负责释放空间的
走好每一步 2008-10-15
  • 打赏
  • 举报
回复
还是自己找本书看明白了,难过
走好每一步 2008-10-14
  • 打赏
  • 举报
回复
本想给你们辛苦分的,但我真的没从上学到一点东西

从书本上直接搬来的回答,令我太失望了
走好每一步 2008-10-14
  • 打赏
  • 举报
回复
本想给你们辛苦分的,但我真的没从上学到一点东西

从书本上直接搬来的回答,令我太失望了
ltttklyzy 2008-10-13
  • 打赏
  • 举报
回复
因为你用的是基类指针指向派生类对象,根据多态的规则,你这里只会调用基类的析构函数。

如果不是通过这样的一个指针来析构的话,而是一个派生类对象的生命期结束时,那么析构的顺序将是没问题的:先CB后CA

所以我想,析构函数会通过某种方式或手段,获知自己是否是派生类,因而调用基类的析构函数(如果是派生类)。
sealrose 2008-10-13
  • 打赏
  • 举报
回复
未被初始化的内存,为什么其中的数据是不确定的,因为内存回收后是不清除数据的
,我决得父类的析构函数被调用后,这个对象的所有数据就变成了可以被其他任意
程序所占有的数据.析构也许是摸掉数据的左右,加一个虚函数我决得差不多就掉用
子类的析构函数了,根据多态.
virtual ~CA() {cout < < "A's destructed.\n"; }

coverallwangp 2008-10-13
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 wangdeqie 的回复:]
C/C++ code
virtual ~CA() {cout << "A's destructed.\n"; }//基类虚析构函数
[/Quote]

正解!
chenzhp 2008-10-13
  • 打赏
  • 举报
回复
如果该类作为基类,那么其析构函数要声明为 virtual
coverallwangp 2008-10-13
  • 打赏
  • 举报
回复
应为p_a是CA的指针,所以只调用CA的析构函数
如果改为CB * p_a则运行结果为
A's constructed.
B's constructed.
B's destructed.
A's destructed.
wangdeqie 2008-10-13
  • 打赏
  • 举报
回复

virtual ~CA() {cout << "A's destructed.\n"; }//基类虚析构函数
fox000002 2008-10-13
  • 打赏
  • 举报
回复
基类析构要加 virtual

64,681

社区成员

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

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