关于派生类析构函数的问题

kanghuaxing 2004-12-21 04:37:29
有两个类:
class A
{
virtual void termclass();
private
virtual ~B;

}
void A::termclass()
{
printf("A is end");
}
class B:A
{
virtual void termclass();
private
virtual ~B;
}
void B::termclass()
{
printf("B is end");
}
由于B是A的派生类,所以B退出时除了调用自己的析构函数外,还要调用A的析构函数
于是我再A的析构函数中加入
this->termclass()
来试图在A或B的实例退出时实现多态,即是A的实例退出时调用A的termclass方法,B的实例退出时调用B的termclass方法.
但是最后运行是,不管A还是B的实例退出时都是返回的“A is end”
应该来说this是指向的当前的对象,通过虚汗数应该实现多态,但没有实现是什么原因拉?
通过上述问题我主要是想实现让B的父类A的实例退出时能调某个函数释放某些资源,而当B退出时不作这项工作,望指点
...全文
232 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhoujiamurong 2005-03-16
  • 打赏
  • 举报
回复
mark
kanghuaxing 2004-12-28
  • 打赏
  • 举报
回复
在我的程序中,A和B都是用于创建线程的runtime类,B从A上派生而来,在main()中启动A作socket的监听,然后起B的线程来进行处理,我现在在A线程开始初始化的一些资源需要在A线程结束时再释放
kanghuaxing 2004-12-27
  • 打赏
  • 举报
回复
我明白各位的意思,我想实现:A或B退出时都要执行~A(),我是想在~A中根据是A退出还是B退出来作不同的操作,能不能有方法实现
oyljerry 2004-12-27
  • 打赏
  • 举报
回复
应该在派生类的析构中作
zhengwei1984222 2004-12-27
  • 打赏
  • 举报
回复
基类就是基类拥有派生类的共性

为什么要求基类根据派生类的不同而使其行为不同

这些不同应该体现在派生类的构造上啊
双杯献酒 2004-12-22
  • 打赏
  • 举报
回复
当执行到析够函数的时候,
派生类的析构函数已经执行完毕,
派生类提供的附加功能已经完全失效,
因此,此时的虚函数机制不起作用。

同理,构造函数中的虚函数也一样,
因为这个时候,派生类的成员还没有构造出来。
wujian53 2004-12-22
  • 打赏
  • 举报
回复
常见的实现就是用基类的指针调用相关的函数来实现;
但是对象的生命周期到的时候你只有基类的指针, 却要去释放派生类的对象;
这时需要虚析构函数;
举例:
class base{};
class child : public base
{
char *p;
public:
child() { p = new char[20];}
~child() {delete []p;}
};

base *p = new child;
当你要delete p;这时你发现并没有调用 ~child() {delete []p;}
也就是child 的空间并没有被回收;这是个重大错误;
但是虚析构函数可以解决
class base{
public:
virtual ~base(){};
};
class child : public base
{
char *p;
public:
child() { p = new char[20];}
virtual ~child() {delete []p;}
};
这样delete p;就会调用virtual ~child() {delete []p;}
这里你应该
#pragma warning(disable: 4530)
#pragma warning(disable: 4786)
#include <iostream>

using namespace std;


class A
{
public:
virtual void termclass()
{
printf("A is end\n");
}
virtual ~A()
{
termclass();
};

} ;

class B : public A
{
public:
virtual void termclass()
{
printf("B is end\n");
}
virtual ~B()
{
termclass();
};
} ;


int main(int argc, char *argv[])
{

A *p = new B();
delete p; ;//这里调用

}
---------- Run ----------
B is end
A is end
Normal Termination
输出完成 (耗费 0 秒)。

wujian53 2004-12-21
  • 打赏
  • 举报
回复
多态性要有指针才能实现;
BluntBlade 2004-12-21
  • 打赏
  • 举报
回复
“B的对象就成了A的成员”不太正确。
应该是“B对象退化成了A对象”。
谁申请资源,就由谁来负责释放资源。
B的工作不应该由A来完成。
kanghuaxing 2004-12-21
  • 打赏
  • 举报
回复
你的意思是,b析构时,先调~B,再调~A,调~B后,B的对象就成了A的成员,所以无法多态?
但是有没有别的方法实现“让B的父类A的实例退出时能调某个函数释放某些资源,而当B退出时不作这项工作”
peacess 2004-12-21
  • 打赏
  • 举报
回复
我试了一下没有所说的问题啊???
BluntBlade 2004-12-21
  • 打赏
  • 举报
回复
当B的成分(即非A成分)被析构之后,VPTR就指向了A类的VTBL了。所以在你的例子中不可能实现多态。
当B被析构之后,它就变成一个A对象了。怎么还会有多态的可能?

64,662

社区成员

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

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