请教类的构造/析构用法 ( 积分: 50 )

  • 主题发起人 主题发起人 hn_chx
  • 开始时间 开始时间
H

hn_chx

Unregistered / Unconfirmed
GUEST, unregistred user!
本人看到有的资料提到“父类的destructor destroy必须是virtural,这样在子类中可以override该方法,并在override的方法中用inheited destroy可以调用父类的destroy”。
可我不用virtural,直接覆盖destructor destroy,并在覆盖的方法中也可以用inheited destroy可以调用父类的destroy完成同样的功能啊。
请问这两者有什么区别???
 
本人看到有的资料提到“父类的destructor destroy必须是virtural,这样在子类中可以override该方法,并在override的方法中用inheited destroy可以调用父类的destroy”。
可我不用virtural,直接覆盖destructor destroy,并在覆盖的方法中也可以用inheited destroy可以调用父类的destroy完成同样的功能啊。
请问这两者有什么区别???
 
好像constructor 和 destructor是不用写virtural的吧
 
to richiesj1118:
为何constructor 和 destructor不用virtual,是不是在DELPHI中规定的?
自己定义的方法就要加上virtural是吗??
 
因为父类与子类的继承关系,所以系统自己调用构造和析构函数,不知道说的对不对
 
可以被继承的方法要加上Virtual
 
to corinth:
我自己定义父类、子类,必须要使用inherited 才能调用父类的方法啊

to 川中小马:
父类的方法不加上virtual; 在子类中也能调用的
 
virtural表示该方法在当前类的子类中可以被重载override

如果父类已经存在同名定义方法并且被定为 virtural,则子类定义时,如果不用 override 则表示覆盖,用 override 则表示重载。重载要求方法的参数必须与父类的一致,而覆盖则可以不同。重载和覆盖带来的结果是不一样的。举个例子:

type
TMyParent=class(TObject)
public
procedure A; Virtual;
procedure B;
end;

TMyChild1=class(TMyParent)
public
procedure A(a:integer);
end;

TMyChild2=class(TMyParent)
public
procedure A; override;
end;

procedure TMyParent.A;
begin
end;

procedure TMyParent.B;
begin
A(); //调用了A
end;

var Child1:TMyChild1;
Child2:TMyChild2;
begin
Child1:=TMyChild1.Create;
Child2:=TMyChild2.Create;

//注意 TMParent 的方法B中是调用了方法A
Child1.B(); //执行B,覆盖A,实际上调用了TMyParent的A
Child2.B(); //执行B,重载A,实际上调用了TMyChild2的A
end;

通过以上例子可以看出:
1、覆盖只是在子类中覆盖了父类的同名方法,在子类中调用这个名字的方法其实就是执行新的方法;而原来父类中所引用到的方法还是原来再父类中定义的,也就是说子类继承下来的方法如果在父类中定义调用到这个名字方法时,还是执行原来父类中定义的方法。就项Child1.B执行的还是原来TMyParent中的A。
2、重载相当于重新定义父类的方法的实现,在子类中调用这个名字的方法其实就是执行新的方法;而原来父类中所引用到的方法将以子类中定义的,就是是说子类继承下来的方法如果在父类中定义调用到这个名字方法时,则执行的将是子类中新定义的方法。就项Child2.B执行是新的 原来TMyChild2中的A。

对于 destructor destroy ,一般情况下,如果覆盖了原来的父类方法,在子类新方法中加上 inheited destroy 对于类本身应该没有什么影响。不过建议对于析构函数不要用覆盖而是要用重载,以免对于一些内部比较特殊的类会有影响(具体什么情况还想不出来,但是对于析构还是用重载比较稳妥一点)
 
哈哈,看了plenilune168对virtural、override的解释和提供的例子终于明白覆盖和重写的概念了。

就我的理解:
override 实际上就是在子类的定义中对其继承的父类方法重新定义,使得子类从父类继承过来的没有覆盖,重写的方法在调用该方法时,调用的是新重新定义的方法。

在此,非常感谢各位对在下的帮助!!!

to plenilune168:
更正你的一点错误,实际上override是重写的意思,其特征是参数类型和个数必须和父类的要一致;而overload才是重载的意思,也就是在同一个类中可以有多个同名的方法,只是参数类型或个数要不同
 
谢谢指正。
没有正规学习过这个概念名称,几个东西我也不知道怎么翻译,反正就是直接拿来用,呵呵
 
后退
顶部