vitual的困惑(50分)

  • 主题发起人 主题发起人 coolrain
  • 开始时间 开始时间
C

coolrain

Unregistered / Unconfirmed
GUEST, unregistred user!
这virtual是怎么回事??
以下是Delphi help 中的例子,可要我的delphi中编绎不能通过:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

type

TFigure = class
procedure Draw
virtual;
end;
TRectangle = class(TFigure)
procedure Draw
override;
end;
TEllipse = class(TFigure)
procedure Draw
override;
end;


var
Form1: TForm1;

implementation

{$R *.DFM}
{ TRectangle }

procedure TRectangle.Draw;
begin
inherited;

end;

{ TEllipse }

procedure TEllipse.Draw;
begin
inherited;

end;

procedure TForm1.Button1Click(Sender: TObject);
var

Figure: TFigure;
begin
Figure := TRectangle.Create;
Figure.Draw
// calls TRectangle.Draw
Figure.Destroy;
Figure := TEllipse.Create;
Figure.Draw
// calls TEllipse.Draw
Figure.Destroy;
end;



end.


{ TEllipse }

procedure TEllipse.Draw;
begin
inherited;

end;

end.
 
TFigure 定义的虚方法在子类TRectangle和TEllipse 中必须实现,
不能只有一个inherited

TFigure也必须写:
procedure TEllipse.Draw;
begin
end

-----
http://www.8421.org
 
该问题已解决了。
有些心得,拿出来分享,欢迎指正。
当基类中有virtual方法时,基类仍要实现该方法,派生类可继承、重载该方法。
当基类中有virtaul abstract方法时,基类不可也不能实现,派生类不可继承,只能重载。
 
可以结束问题了?
 
to qdyoung:
那override什么时候不能用??
基类中包含有static方法吗?
delphi中的static方法是怎么回事?
老兄知吗?
放心,分会给的。
 
由于从来用不到写复杂的类,这些东西没怎么用到,所以也不能跟你说清除,
你还是自己看看object pascal的帮助吧
 
abstract光说不练,完全有子类去做。我想再还不知道为什么出这个东东。
virtual是个好东东,子类可以继承,还可以有自己的行为
 
abstract的设计应是考虑接口的需要。
 
后退
顶部