求教关于析构函数问题 ( 积分: 100 )

  • 主题发起人 主题发起人 Renminer
  • 开始时间 开始时间
R

Renminer

Unregistered / Unconfirmed
GUEST, unregistred user!
我在父类中定义了析构函数后,在子类中也定义了同名析构函数,在子对象free的过程中,好象只调用了子类中的析构函数,父类中的析构函数并没有执行.是这样吗?
在子类中的析构函数,是不是应该将父类的析构函数的功能再写一遍?
base class
//....
public
destructor destroy();override;
end;

deri=class(base)
//...
public
destructor destroy();override;
end;

////////////////////////////////////////////////
//创建及销毁
deriObject:=deri.create();
//...
deriObject.free

多谢
 
我在父类中定义了析构函数后,在子类中也定义了同名析构函数,在子对象free的过程中,好象只调用了子类中的析构函数,父类中的析构函数并没有执行.是这样吗?
在子类中的析构函数,是不是应该将父类的析构函数的功能再写一遍?
base class
//....
public
destructor destroy();override;
end;

deri=class(base)
//...
public
destructor destroy();override;
end;

////////////////////////////////////////////////
//创建及销毁
deriObject:=deri.create();
//...
deriObject.free

多谢
 
在子类中加上
inherited吧!
 
按你的意思,应该在子类调用父类的Destroy释放资源,可以
加上inherited调用(调用前先销毁自己创建的对象以释放资源)
比方说,如下:
type
Base =class(TObject)
private
public
AButton :TButton;
constructor Create();
destructor Destroy();override;
end;

Direct =class(Base)
private
AEdit :TEdit;
public
constructor Create();
destructor Destroy();override;
end;

implementation

constructor Base.Create();
begin
inherited;
AButton :=TButton.Create(AButton);
end;

constructor Direct.Create;
begin
inherited;
AEdit :=TEdit.Create(AEdit);
end;

destructor Base.Destroy;
begin
AButton.Free;
inherited Destroy;
end;

destructor Direct.Destroy;
begin
self.AEdit.Free;
inherited Destroy;
end;

end.

Create 和 Destroy 的 inherited 调用次序不一样
 
inherited 就是调用父类的方法,昨天还有个大虾在说我,Free和Destroy的区别呢,呵呵

子类如果要调用父类的方法用inherited据可以了

通常我们都会覆盖父类方法。在声明的时候加上override关键字覆盖。在定义的时候加了inherited就会调用父类的方法
 
base中一定要用inherited吗? 不用行吗?
 
你明不明白用 inherited 的目的是什么啊?
 
inherited的意思就是继承,如果不用表示不继承,而且你也看到了你用override关键字,它的意思就是覆盖,所谓覆盖当然是当外面调用的时候调用子类的方法,而不是父类的方法。另外
两中情况,如果默认就调用,那么我想先析构子类的内容,再析构父类的内容,或者反过来,就不好处理了
默认不调用,但是你不写inherited,那么系统怎么知道我们想调用哪个呢
 
声明虚拟析构方法以让派生类改写(覆盖或继承),用上inherited进行继承,这样编译器
能够产生正确的机器代码调用到派生类的析构函数,并能经由inherited关键字顺着继承
架构一直正确的执行到TObject的Destroy,让继承架构中的每一个类都获得释放资源的
机会。如果不用inherited,则编译器只是调用TObject的析构函数进行资源释放,这样,
继承架构中如果有其他的层次,它们分配的资源就得不到释放,会造成内存泄漏。
 
Jonson_sunshine多谢
 
后退
顶部