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

  • 主题发起人 主题发起人 gulang
  • 开始时间 开始时间
G

gulang

Unregistered / Unconfirmed
GUEST, unregistred user!
老给别人回答,这次我也出个问题。知道答案的高手先别记着说,让大家先讨论讨论[:D]
type
Tperson=class
public
procedure draw();virtual;
end;

Tman=class(Tperson)
public
procedure draw();overload;
end;

Twoman=class(Tperson)
public
procedure draw();override;
end;

Tform1=class(Tform)
public
a:Tman;
b:Twoman;
end;

procedure Tperson.draw();
begin
showmessage('person');
end;

procedure Twoman.draw();
begin
showmessage('woman');
end;
procedure Tman.draw();
begin
showmessage('man');
end;

[red]procedure TForm1.Button1Click(Sender: TObject);
begin
a.draw;
b.draw

end
[/red]
button1Click执行有问题吗?有什么问题?为什么?
 
Tform=class(Tform)
确实经典
 
Tman=class(Tperson)
public
procedure draw();overload;
end;
这个的问题吧 重载 不是这么用的吧?
 
前面语法没问题,不信可以试试。问题在:
procedure TForm1.Button1Click(Sender: TObject);
begin
a.draw;
b.draw

end

里面。
 
除了a,b没被初始化外,看不出有什么问题
 
这个例子的意义在哪? 除了 overload
用得不好理解以外, 好像没什么特别的.
也可能是我愚昧, 或许楼主另有深意, 请指教.

-------------------------------------------
我的 Delphi 博客: http://del.cnblogs.com/
 
procedure TForm1.Button1Click(Sender: TObject);
begin
a.draw
//没问题
b.draw
//有问题
end;
 
a.draw

b.draw

a,b都是指针,作为参数传给了draw.但这个draw没有用这个a,b来干啥,所以是不会出错的。也就是没问题的。
 
什么问题 说出来呀
我没说你的重载有问题 只是说不是这么用的

不过的确没实例化就是了
 
Tman=class(Tperson)
public
procedure draw();override;//overload改成override
end;
 
a.draw是可以执行的,注意:不需要对a实例化就可以运行。
b.draw却不行的。
这里这么写确实没什么实际意义,但里面包含了重载、多态等概念。只有深入理解了这些概念才能解释这些问题。
 
哈哈,周爱民对此问题有过讨论,摘取如下:
1.如果方法不存取“实例(对象)中的数据”,那么无论如何调用这个方法,都是安全的。因为方法的执行代码总是存在
2.在调用虚方法和动态方法时,Delphi总是要利用实例头部的类指针来寻找方法表,因此,不能试图通过一个非类的实例来访问虚方法和动态方法
3.由于不能对虚方法和动态方法使用这样的技巧,因此也无法利用对象的继承性、封装性和多态性我们使用这样的技巧的唯一理由,就是不需要任何额外的内存支出便可以调用这些方法。——这很明显,我们根本就不创建任何的实例对象
4.要想对虚方法和动态方法使用这样的技巧,那么至少需要一个指向该类的指针。这与对象实例的数据结构有关:无论如何,一个对象实例至少占有4个字节,并且指向对象所属的类,例如 :
procedure TForm1.btn2Click(Sender: TObject);
var
p : pointer;
begin
p := Twoman
// 指向该类的指针
Twoman(@p).draw
// 将@p强制为对象,并执行方法调用
end;
 
Tman=class(Tperson)
public
procedure draw();overload;
end;
这个编译delphi都会提示有问题啦,要覆盖父类的虚拟方法,必须使用关键字reintroduce重新声明
 
原来如此....
 
执行是没问题,关键是a.draw有问题.如果做一个向上转型,应该思路上就没有问题了.
 
鄙视直接摘取,呵呵,不会是原封不动搬过来的吧?[:)]
 
1.如果方法不存取“实例(对象)中的数据”,那么无论如何调用这个方法,都是安全的。因为方法的执行代码总是存在
真的是这样子的啊 :)
 
[:D],知道就好。
 
wan_yi
刚发现你就是大名鼎鼎的万一啊,博客做的挺好,我还收藏着呢,[:)]
http://del.cnblogs.com/
也感谢为您为delphi做的贡献。
 
后退
顶部