父类虚析构函数是怎么被调用的?

gattuso8 2008-10-30 10:50:42
父类虚析构函数是怎么被调用的?

父类把自己的析构函数社成虚函数。
当使用子类/父类指针delete时,子类,父类的析构都将被调用到?
这是怎么实现的呢?
按说 子类的虚函数表里只有自己的析构函数啊
还是 析够父类直接作为子类析构函数的一部分?
。。。有点拗口

#include <iostream.h>

class Base1
{
public:
Bese1()
{
cout<<"Base1::Bese1()"<<endl;
}
virtual
~Base1()
{
cout<<"Base1::~Base1()"<<endl;
}
virtual void Func()
{
cout<<"Base1::Func()"<<endl;
}

int i;
};

class Derive : public Base1 //,public Base2
{
public:
Derive()
{
cout<<"Derive::Derive()"<<endl;
}
~Derive()
{
cout<<"Derive::~Derive()"<<endl;
}
void Func()
{
cout<<"Derive::Func()"<<endl;
}
int j;
};

void main()
{
cout<<"---------------Base1*----------------"<<endl;
Base1* p = new Derive();
cout<<endl;

p->Func();
cout<<endl;

delete p;
cout<<endl<<endl;
}


猜测Derive 内存结构

|-------------------------|
| int i; |
|-------------------------|
| _vptr_Base1 |---------->|----------------------|
|-------------------------| | type info Derive |
| int j; | |----------------------|
|-------------------------| | Derive::~Derive() |
|----------------------|
| Derive::Func() |
|----------------------|





...全文
899 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhaohongbo83 2008-10-30
  • 打赏
  • 举报
回复
这个应该是自动调用的,晚上回去看下
gattuso8 2008-10-30
  • 打赏
  • 举报
回复

delete子类指针时 都会被调用
delete父类指针时(非虚析构) 只调用父类析够
delete父类指针时(虚析构) 都会被调用
devil_zuiai 2008-10-30
  • 打赏
  • 举报
回复
A 父类, B 子类;

B * pB = new B;
A * pA = pB;
delete pA; // 如果不是虚析构函数只调用父类,如果是虚析构函数,先调用子类,再调用父类。


可以运行一下下面的例子,把父类的析构设置成虚的或者不虚,看看结果就更清楚了。

#include<iostream>
using namespace std;


class A
{
public:
A()
{
printf("BeginA\n");
}

virtual ~A()
{
printf("EndA\n");
}
};

class B : public A
{
public:
B()
{
printf("BeginB\n");
}

~B()
{
printf("EndB\n");
}
};

int main()
{

B * pB = new B;
A * pA = pB;
delete pA;

return 0;
}
gattuso8 2008-10-30
  • 打赏
  • 举报
回复
不好意思,说反了
lann64 2008-10-30
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 gattuso8 的回复:]

其实任何子类析构函数都会被编译器改写为
先调用父类析构函数
是吧?
[/Quote]
一般是后调用吧?
lann64 2008-10-30
  • 打赏
  • 举报
回复
所有子类析构函数都会调用父类的析构函数去析构子类中的父类成分,不管是不是虚析构函数。
设成虚析构函数只能方便用父类指针或引用指向子类时,能够使用子类的析构。
gattuso8 2008-10-30
  • 打赏
  • 举报
回复

其实任何子类析构函数都会被编译器改写为
先调用父类析构函数
是吧?
mmidd 2008-10-30
  • 打赏
  • 举报
回复
自动被调用,不用显示调用
beyondlwm 2008-10-30
  • 打赏
  • 举报
回复
如果删除子类指针,则直接调用子类析构函数
如果删除父类指针,则会调用当前对象的析构函数,即,有可能删除一个父类指针但是调用的是子类的析构函数

构造函数才是,子类调用时一起调用父类的构造函数
baihacker 2008-10-30
  • 打赏
  • 举报
回复
首先由于是虚函数,于是能保证调用的是子类的析构函数.
在子类的析构函数内,会主动调用父类的析构函数,这个绑定是静态的.
gattuso8 2008-10-30
  • 打赏
  • 举报
回复
晕 没敢用TAB 图还是乱了

64,654

社区成员

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

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