Tclass1 = class (TObject)
    function A: string;
  public
    procedure B;
  end;  Tclass2 = class (Tclass1)
    function A: string;
  public  end;{*********************************** Tclass1 ************}
function Tclass1.A: string;
begin
  result:='ok:class1';
end;procedure Tclass1.B;
begin
  showmessage(A);
end;{*********************************** Tclass2 *************}
function Tclass2.A: string;override;
begin
  result:='ok:class2';
end;
{*********************************************************}
procedure TForm1.Button1Click(Sender: TObject);
var c:Tclass1;d:Tclass2;
begin
  c:=Tclass1.Create;
  d:=Tclass2.Create;
  c.B;
  d.B;
  c.Free;
  d.Free;
end;我期望的结果是:
ok:class1
ok:class2实际结果是
ok:class1
ok:class2在Java中这样定义输出的结果是:
ok:class1
ok:class2请大家讨论!

解决方案 »

  1.   

    更正
    {*********************************** Tclass2 *************}
    function Tclass2.A: string;
    begin
      result:='ok:class2';
    end;
      

  2.   

    TClass2 的 A 方法是引入的一个新的方法,屏蔽了 TClass1 的 A 方法,B 方法从 TClass1 继承。
      

  3.   

    既然class2中的A屏蔽了class1中的A,那为什么调用class2.b 显示的仍旧是“ok:class1”?
      

  4.   

    我期望的结果是:
    ok:class1
    ok:class2实际结果是
    ok:class1
    ok:class2
    在Java中这样定义输出的结果是:
    ok:class1
    ok:class2是不是我看错了,你想和实际的结果是一样的呀!!!!!!!!
      

  5.   

    class1,class2,都是class的派生类
    我想知道class2.B是怎么实现的? 
    和你定义的不匹配呀
      

  6.   

    更正
    实际结果是
    ok:class1
    ok:class1
      

  7.   

    就因为 function A: string;不是virtual 所以那为什么调用class2.b 显示的仍旧是“ok:class1”?
      

  8.   

    Tclass1 = class (TObject)
        function A: string;virtual;
      public
        procedure B;
      end;  Tclass2 = class (Tclass1)
        function A: string;  override;
      public  end;
    function Tclass1.A: string;
    begin
      result:='ok:class1';
    end;procedure Tclass1.B;
    begin
      showmessage(A);
    end;{*********************************** Tclass2 *************}
    function Tclass2.A: string;
    begin
      result:='ok:class2';
    end;
      

  9.   

    你把tclass2的override关键字去掉
    才是静态的覆盖了祖先类的方法
      

  10.   

    Tclass1 = class (TObject)
        function A: string;virtual;
      public
        procedure B;
      end;  Tclass2 = class (Tclass1)
        function A: string;override;
      public  end;
    {*********************************** Tclass1 ************}
    function Tclass1.A: string;
    begin
      result:='ok:class1';
    end;procedure Tclass1.B;
    begin
      showmessage(A);
    end;{*********************************** Tclass2 *************}
    function Tclass2.A: string;
    begin
      result:='ok:class2';
    end;
    {*********************************************************}
    procedure TForm1.Button1Click(Sender: TObject);
    var c:Tclass1;d:Tclass2;
    begin
      c:=Tclass1.Create;
      d:=Tclass2.Create;
      c.B;
      d.B;
      c.Free;
      d.Free;
    end;
      

  11.   

    C++:
    #include <iostream.h>
    class class1
    {
      public:
        virtual char*A()
        {
          return "ok:class1";
        }
        void B()
        {
          cout<<A()<<endl;
        }
    };class class2: public class1
    {
      public:
        char*A()
        {
          return "ok:class2";
        }
    };void main()
    {
       class1 *c;
       class2 *d;
       c = new class1;
       d = new class2;
       c->B();
       d->B();
       delete c;
       delete d;
    }
    //输出结果为ok:class1,ok:class2,如果去掉virtual结果是ok:class1,ok:class1。
    //典型虚函数动态联编的例子JAVA:
    public class test {
       public static class Class1{
         public String A(){
           return "OK:Class1";
         }   
         public void B(){
           System.out.println(A());
         }
       }   
       public static class Class2 extends Class1 {
         public String A(){
           return "OK:Class2";
         }
       }   
       public static void main(String[] args){
         Class1 c;
         Class2 d;     
         c = new Class1();
         d = new Class2();     
         c.B();
         d.B();
       }
    }
    //输出结果为ok:class1,ok:class2为什么JAVA结果就不一样哪?
    Java怎么能得到ok:class1,ok:class2的结果哪?
      

  12.   

    更正:应该为
    Java怎么能得到ok:class1,ok:class1的结果哪?
      

  13.   

    哈哈,我给你改过来啊,完全正确,结果就是你想要的那种
    UNIT1单元
    unit Unit2;interfaceuses QDialogs;
    type
    Tclass1 = class (TObject)
        function A: string;virtual;  public
        procedure B;
    end;
    implementationfunction Tclass1.A: string;
    begin
      result:='ok:class1';
    end;procedure Tclass1.B;
    begin
      showmessage(A);
    end;
    end.
     
    Unit2单元
    unit Unit3;interfaceuses QDialogs, Unit2;type
        Tclass2 = class (Tclass1)    function A: string;override;
      publicend;
    implementationfunction Tclass2.A: string;
    begin
      result:='ok:class2';
    end;end.
     
    Form1单元var
      Form1: TForm1;implementationuses Unit2, Unit3;{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    var c:Tclass1;
        d:Tclass2;
    begin
      c:=Tclass1.Create;
      d:=Tclass2.Create;
      c.B;
      d.B;
      c.Free;
      d.Free;
    end;end.