请问Delphi有没有多态?

解决方案 »

  1.   

    当然有!
    Delphi中的多态不但有而且有两种:
    virtual和dynamic。
    virtual不用说了,和C++、Java是一样的。
    dynamic比virtual慢,但省内存,是用索引号存储的。我感觉很象是在BC3.1及以前版本中出现但在BC4.0中删掉的DDVT技术(直到现在我还在怀念virtual void MyVun() = [WM_CREATE];的写法,可惜没有了,只能用我最讨厌的case去写消息函数了。伤感中……)
      

  2.   

    procedur abc(a:integer);overload;procedure abc(ab:string);overload;
      

  3.   

    路过而已 啦 
     人唯一靠得住的事自己和自己的母亲,别指望别人能帮助你多少
                         http://mama520.126.com
      

  4.   

    呵呵,这种问题也太有点....... Delphi是面向对象的语言,你说有没有多态呢?另外对于多态,要牢记一个概念上的差别 关键字Override是用来实现多态,可以叫覆盖和重写;
    而Overload是和面向对象无关的,当然也就和多态没有任何的关系,这个叫重载,是Delphi的一种语言特性!所有楼上的FirstShine的例子举的并不是多态的概念!
      

  5.   

    同意楼上。
    函数重载并不是并不是多态(C++中的函数重载和操作符重载也不是)。
    多态又叫动态联编(或动态连接)是指在编译连接时不确定调用哪个函数,而是在运行时才确定。在Delphi中是用虚函数指针表和动态函数指针表来实现的,表现在Object Pascal语法中就是virtual方法和dynamic方法。这个函数指针表是放在你的变量(对象)中的,当你的变量不同时,调用的函数也就不同,从而实现了多态。
    此外,函数重载虽然可以带来一些好处,但很多时候也会使程序的可理解性变差,一定要慎用。
      

  6.   

    做了一个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.
    一个多太的最简单例子