做了一个OP的小例子用CONSOLE的方式的 program Project1;{$APPTYPE CONSOLE}uses SysUtils;type A=class PROTECTED procedure X;virtual;abstract; PUBLIC procedure dox; end; type B=class(A) PROTECTED pROCEDURE X;override; end; type C=Class(A) PROTECTED procedure X;override; end;{ B }procedure B.X; begin WRITELN('B'); end;{ C }procedure C.X; begin WRITELN('C'); end;procedure A.dox; begin x; end;var D:A; { A } begin D:=B.create; D.dox; D.free; D:=C.create; D.dox; D.free; readln; end. 一个多太的最简单例子
Delphi中的多态不但有而且有两种:
virtual和dynamic。
virtual不用说了,和C++、Java是一样的。
dynamic比virtual慢,但省内存,是用索引号存储的。我感觉很象是在BC3.1及以前版本中出现但在BC4.0中删掉的DDVT技术(直到现在我还在怀念virtual void MyVun() = [WM_CREATE];的写法,可惜没有了,只能用我最讨厌的case去写消息函数了。伤感中……)
人唯一靠得住的事自己和自己的母亲,别指望别人能帮助你多少
http://mama520.126.com
而Overload是和面向对象无关的,当然也就和多态没有任何的关系,这个叫重载,是Delphi的一种语言特性!所有楼上的FirstShine的例子举的并不是多态的概念!
函数重载并不是并不是多态(C++中的函数重载和操作符重载也不是)。
多态又叫动态联编(或动态连接)是指在编译连接时不确定调用哪个函数,而是在运行时才确定。在Delphi中是用虚函数指针表和动态函数指针表来实现的,表现在Object Pascal语法中就是virtual方法和dynamic方法。这个函数指针表是放在你的变量(对象)中的,当你的变量不同时,调用的函数也就不同,从而实现了多态。
此外,函数重载虽然可以带来一些好处,但很多时候也会使程序的可理解性变差,一定要慎用。
program Project1;{$APPTYPE CONSOLE}uses
SysUtils;type
A=class
PROTECTED
procedure X;virtual;abstract;
PUBLIC
procedure dox;
end;
type
B=class(A)
PROTECTED
pROCEDURE X;override;
end;
type
C=Class(A)
PROTECTED
procedure X;override;
end;{ B }procedure B.X;
begin
WRITELN('B');
end;{ C }procedure C.X;
begin
WRITELN('C');
end;procedure A.dox;
begin
x;
end;var
D:A;
{ A }
begin
D:=B.create;
D.dox;
D.free;
D:=C.create;
D.dox;
D.free;
readln;
end.
一个多太的最简单例子