关于析构问题

木兮₀₃₂₁ 2012-03-18 04:34:10
#include <IOSTREAM>
using namespace std;
class a
{
public:
~a(){cout<<"调用父类析构函数!";}

};
class b:public a
{
public:
~b(){cout<<"调用子类析构函数!";}
};
void main()
{
a *pa=new b;
delete pa;
}//子类被析构了吗?
...全文
179 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
PunWinger 2012-03-18
  • 打赏
  • 举报
回复
看Effective C++的条款7,有关于这方面的介绍,总之就是如果有virtual函数(要用基类指针指向子类,实现多态性)的话,基类必须要设置virtual的析构函数
liuyx23 2012-03-18
  • 打赏
  • 举报
回复
是这样的 我看明白你的问题了 在堆中确实是一个子类对象 但你要知道在派生中的内存布局,布局中先是基类的信息,然后子类新增信息,所以这种执行方式为早绑定,只释放了子类对象的基类继承来的数据部分。
至于为什么虚函数就可以了 c++为晚绑定提供的基础是virtual 而技术手段是为多态对象建立一个虚表,这表只有对象类型为多态类型才有,如此在堆中的对象内存中存放的地址不是直接指向函数入口,而是指向虚表,通过虚表再去寻找函数入口地址,这样就可以实现晚绑定了。
追求执着 2012-03-18
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 xiongguang1111111 的回复:]

为什么把a类的析构函数申明为虚函数就可以了?
[/Quote]
看看面向C++面向对象的多态性!!!
木兮₀₃₂₁ 2012-03-18
  • 打赏
  • 举报
回复
为什么把a类的析构函数申明为虚函数就可以了?
雪狐晨光 2012-03-18
  • 打赏
  • 举报
回复
肯定没有啊!这是因为程序无法访问进去! 因此才会产生虚基类的!
蓝枫10 2012-03-18
  • 打赏
  • 举报
回复
把析构函数把声明成虚函数```
追求执着 2012-03-18
  • 打赏
  • 举报
回复
派生类创建:
先调用基类的构造函数,在调用派生类的构造函数;
派生类的删除:
先调用派生类的析构函数,在调用基类的析构函数!!

在这里你使用了基类的指针来创建派生类的对象,而直接删除指针时,类型识别只能找到基类的部分,所以派生类中的部分无法删除,就如三楼所说!!
bluewanderer 2012-03-18
  • 打赏
  • 举报
回复
堆里的的确是b的实例,但是你告诉编译器堆里是个a,编译器只能听你的。
木兮₀₃₂₁ 2012-03-18
  • 打赏
  • 举报
回复
调用析构函数,删除在堆中创建的对象。堆中的对象不只有,子类吗?
pengzhixi 2012-03-18
  • 打赏
  • 举报
回复
子类部分没有被析构。这就是为什么基类的析构函数必须声明为virtual的原因
bluewanderer 2012-03-18
  • 打赏
  • 举报
回复
函数调用的上下文是有调用对象的类型决定的。*pa是a类型的,所以调用的是a类型的析构函数。如果希望能通过a类型调用到b类型的析构函数,a类型需要把析构函数定义为虚函数 virtual ~a() {...}
木兮₀₃₂₁ 2012-03-18
  • 打赏
  • 举报
回复
书上说,使用delete pa时,将自动调用析构函数,删除在堆中创建的对象,但是调用的却是基类的析构函数,请问,在队中的对象不是子类吗?为什么调用父类的析构函数、?

65,210

社区成员

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

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