在子类的同名方法中用inherited来调用父类同名方法
哪怕没有override关键字
taaa = class
procedure msg;
end; tbbb = class(taaa)
procedure msg;
end;procedure taaa.msg;
begin
ShowMessage('taaa.msg');
end;procedure tbbb.msg;
begin
ShowMessage('tbbb.msg');
inherited;
end;
override是可有可无的?还是说delphi在编译时作了处理?
哪怕没有override关键字
taaa = class
procedure msg;
end; tbbb = class(taaa)
procedure msg;
end;procedure taaa.msg;
begin
ShowMessage('taaa.msg');
end;procedure tbbb.msg;
begin
ShowMessage('tbbb.msg');
inherited;
end;
override是可有可无的?还是说delphi在编译时作了处理?
解决方案 »
- 学了两个月Delphi
- 奇怪的效率问题
- TListView,TComboBox这种控件如何保存一些Value值啊?
- 请问如何卸载水晶报表组件?
- 请问如何判断adotable表中的记录为空啊?
- 那位高手有空,帮我写个sql语句??
- 为什么dbgrid不能编辑? 在线给分
- 请问如何获取Windows中驱动程序的信息?
- 急救~~~~~DhtmlDEIT在delphi中怎么不好用呀!~~~~现在只能加这么多分,以后回慢慢加的
- delphi在联结sqlserver数据库的时候,设计的时候和运行的时候总是提示输入username和password,请问各路高手如何消去之
- delphi 7 如何在程序外的光标处输出一段字符串和数字?大侠们告诉我该怎么做啊?谢谢了...
- delphi7,TDBCombBox组件问题
如果没有用Virtual和Inherited关键字,父类和子类的同名方法是两个不同的方法,只是在子类里父类的同名方法被隐藏了,不是覆盖,有点类似于重载。
看下面的代码是怎么回事
var A:Taaa;
A:=Tbbb.Create;
A.msg;//以Taaa类来调用,显示taaa.msg
它调用的是父类的Msgy方法,子类有没有这个方法都无所谓都会成功能
如果你想调用子类的方法必须进行类型转换如下
(A as Tbbb).msg;//以Tbbb类来调用,先显示taaa.msg后显示Tbbb.s=msg
再看下面的代码:
var B:Tbbb;
B:=Tbbb.Create;
B.msg//以Tbbb类来调用,先显示taaa.msg后显示Tbbb.s=msg
(B as Taaa).msg;//以Taaa类来调用,显示taaa.msg
这时不会跟你对象的实际类型有关系。
非虚拟方法是静态的,其地址是在编译时由编译器分配的,代码是死的,说简单点你用哪个类来调用,它就调用哪个的静态方法,父类是不可能调用到子类的方法的。 使用虚拟方法就是为国让父类能调用到子类的方法,如果Taaa.msg定义为虚拟方法,然后Tbbb类对它进行重写,那下面的代码将显示相同的结果: 先显示taaa.msg后显示Tbbb.s=msg
var A:Taaa;
A:=Tbbb.Create;
A.msg;
(A as Tbbb).msg;
上面调用的都是Tbbb.msg。
让父类能够以一种统一方式来调用方法而不管理创建的是哪个子类的实例,这正时面向对象编程思想的精妙之处。
可以去看看OO方面的书。
inherited就是调用父类的方法,可以是父类的任何方法(不包括私有成员),c++是在子类中使用“父类名::函数名”这种方式,而delphi就是使用“Inherited 函数名”这种方式,如果是调用同名函数(参数相同),函数名可以省略,这体现了类的继承性。
virtual是声明一个虚函数,override对应是改写父类的一个虚函数,这体现了类的多态性,类的多态性必须靠虚函数才能实现,因为只有虚函数会在运行期绑定(虚函数表),达到父类可以“变成”任何一个子类形态去调用子类的虚函数。