经典老问题,我觉得不错,再拿出来晒晒。(100分)

  • 主题发起人 主题发起人 gulang
  • 开始时间 开始时间
无论楼主的上面写的是否能够执行,上面的这些写法都应该是要避免的.

因为:
1.overload关键字只用于静态方法,如果将它用于一个虚方法,后果不可预料.即使能预料也不应该那么用.
2.调用所有对象的方法之前,除类方法(方法前有Class关键字的)可以直接调用外,其它的都应该养成习惯:在调用前先创建对象,再调用该对象的方法.

  至于说这种错误的用法后会得到什么结果,我真的是实在没有兴趣知道...因为它本身是无意义的...
 
这个问题是从以前的帖子里找来的,那我就发个那时一个高手的解答。这里有不少比较深入的东西,了解这些能帮助我们更好的了解多态、重载、继承。
------------------------------------------------------------
TMan.Draw 是静态方法,所以方法的代码入口在链接时已经确定下来。你没有调用 TMan.Create
而能够正确地调用 TMan.Draw 是因为 TMan.Draw 中没有访问对象实例的任何字段或属性,若
若你改一下:
TMan=class(TPerson)
FMan: Integer;
procedure draw();overload;
end;
...
procedure TMan.Draw;
begin
FMan := 1
//加上这句
showmessage('man');
end;
则不先调用 TMan.Create 创建对象实例就执行 TMan.Draw 将出内存访问错,因为实例的内
存空间尚未分配和初始化。
而 TWoman.Draw override 了 TPerson.Draw 这个虚拟方法,所以 TWonman.Draw 也是虚拟
方法,对该方法的调用,其代码入口是运行时才能决定的,即动态绑定,这是通过运行时在
对象的虚拟方法表(VMT)中搜索方法的入口来实现的,而创建对象时会为其分配内存,初始化
字段,在对象中设置一个指向 VMT 的指针等,你没有调用 TWoman.Create 就执行
TWoman.Draw ,因对象实例还未建立,无法正确根据对象中的 VMT 指针在 VMT 中查找 Draw
方法的代码入口,就产生了错误。因此要先创建对象,才能访问其数据和方法。
 
楼主,
俺觉得还是永远不要让我知道这些比较好
俺宁愿1+1=2的教条式的编程.....
 
>>因此要先创建对象,才能访问其数据和方法。
我的神哪!这么高深的道理居然被人类给总结出来了...


天下本无事
 
多人接受答案了。
 
后退
顶部