unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;   TBaseClass = class(TObject)
     // 定义一个新的父类
   protected
     FMessage: string;
   public
     constructor Create();     // 构造方法  
     procedure MessageBox();virtual; // 显示字符串
   end;
   TChildClass = class(TBaseClass)
     // 定义一个TBaseClass的派生类
   public 
     procedure MessageBox();override; // 重载父类中的方法
   end;
var
  Form1: TForm1;implementation{$R *.dfm}
constructor TBaseClass.Create; 
begin 
   inherited Create();   // 继承父类中的构造方法Create 
   FMessage:= ClassName; // 初始化信息字符串为类名 
end; procedure TBaseClass.MessageBox; 
begin 
   ShowMessage(FMessage); // 显示字符串 
end; procedure TChildClass.MessageBox; 
begin 
   FMessage:= FMessage + FMessage; 
   inherited MessageBox(); // 继承父类中原有MessageBox方法的原有功能
end;procedure TForm1.Button1Click(Sender: TObject);
var 
   Child: TChildClass; 
begin 
   Child:= TChildClass.Create;
   Child.MessageBox();
   Child.Free; 
end;end.

解决方案 »

  1.   

    如果我把以上标红的关键字注释掉 结果是一样的。在什么情况下用virtual和override呢
      

  2.   

    需要子类继承使用virtual
    需要从父类继承使用override
      

  3.   

    如果我们要为类的一个方法添加新的代码而又不希望重写父类方法中原有功能的话,我们可以用override来实现方法的覆盖,那么我把他注释了未什么还可以实现同样的功能。
      

  4.   

    procedure TForm1.Button1Click(Sender: TObject); 
    var 
      Child: TBaseClass
    begin 
      Child:= TChildClass.Create; 
      Child.MessageBox(); 
      Child.Free; 
    end; 如果你的调用代码改成这样,然后再试试不同的情况!
      

  5.   

    因为你inherited MessageBox(); 
      

  6.   

    再网络上看了篇文章,看的更迷糊了。反而不太清楚override具体怎么使用了。
      

  7.   

    override 是对父类声明的vitural或dynamic方法进行覆盖? 是这样么? 请大家指点。