其他分享
首页 > 其他分享> > overload,override,virtual 关键字

overload,override,virtual 关键字

作者:互联网

overload 多态

pascal语法规则中,同一个UNIT中不能有两个重名的函数。

如:

function func(): Boolean;
function func(const x: Char): Boolean;

为了解决这个问题,于是引进了overload关键字。

如下:

function func(): Boolean; overload;
function func(const x: Char): Boolean; overload;

override 覆盖

在派生一个新类的时候,首先会继承父类中所有的私有的成员变量和函数。

如果我们要为派生类的一个方法添加新的功能,而不希望使用父类原方法的功能,我们可以用override来实现对父类方法的覆盖。在该方法中,可用inherited调用父类中的同名方法。

例子:

 1 unit Unit1;
 2 
 3 interface
 4 
 5 uses
 6   Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
 7   Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
 8 
 9 type
10   TBaseClass = class(TObject)
11     public
12       procedure MessageBox() ;
13       procedure vMsg(); virtual;
14   end;
15   TSonClass = class(TBaseClass)
16     public
17       procedure MessageBox();
18       procedure vMsg(); override;
19   end;
20 
21   TForm1 = class(TForm)
22     Button1: TButton;
23     Button2: TButton;
24     procedure Button1Click(Sender: TObject);
25     procedure Button2Click(Sender: TObject);
26   private
27     { Private declarations }
28   public
29     { Public declarations }
30   end;
31 
32 var
33   Form1: TForm1;
34 
35 implementation
36 
37 {$R *.dfm}
38 
39 { TBaseClass }
40 
41 procedure TBaseClass.MessageBox;
42 begin
43   MessageDlg('TBaseClass', mtInformation, [mbOK], 1);
44 end;
45 
46 procedure TBaseClass.vMsg;
47 begin
48   MessageDlg('TBaseClass vvv', mtInformation, [mbOK], 1);
49 end;
50 
51 { TSonClass }
52 
53 procedure TSonClass.MessageBox;
54 begin
55   MessageDlg('TSonClass', mtInformation, [mbOK], 1);
56 end;
57 
58 procedure TSonClass.vMsg;
59 begin
60   MessageDlg('TSonClass vvv', mtInformation, [mbOK], 1);
61 end;
62 
63 procedure TForm1.Button1Click(Sender: TObject);
64 var
65   aObj : TBaseClass;
66 begin
67   aObj := TBaseClass.Create;
68   aObj.MessageBox;
69   aObj.vMsg;
70   aObj.Free;
71 end;
72 
73 procedure TForm1.Button2Click(Sender: TObject);
74 var
75   aObj : TBaseClass;
76 begin
77   aObj := TSonClass.Create;
78   aObj.MessageBox;  //由于父类的方法不是virtual,所以调用的是父类的方法
79   aObj.vMsg;        //由于父类的方法是virtual,所以调用的是子类的方法
80   aObj.Free;
81 end;
82 
83 
84 end.

virtual 虚函数 (下面这段话要深入理解)

virtual关键字是指定方法为虚方法,Object Pascal中,默认情况下,所有方法都是静态的(当然和类方法不同),静态方法的特点是,在对象被创建的时候,编译器会分配所有调用静态方法时所指定的内存地址,也就是说,编译期即指定了调用的具体方法。


而virtual和dynamic方法(虚方法和动态方法)则是在调用时动态分配的。他们的语义是相同的,唯一不同的是,他们的实现方法和调用方法,这涉及到DELPHI的编译机制。

Delphi的编译器会自动维护用于添加虚方法的虚方法表(VMT)和用于添加动态方法的动态方法表(DMT)。
虚方法表存放的是类及其基类声明的所有虚方法指针。每一个类都有并且只有一个虚方法表,当然每一个虚方法表都有一个入口。无论一个类是否有他自己定义的虚方法,只要他继承了祖先类的虚方法,他也就会有自己的虚方法表,并列举出他继承的所有虚方法。因为每一个类都有一个自己的虚方法表,Delphi就可以使用虚方法表来识别一个类,实际上,一个类引用就是指向类的虚方法表的指针。

abstract 方法 - 抽象方法
    abstract方法就是我们常说的抽象方法,该方法只能有声明而不能有实现部分,一般只是提供给派生类override使用的,所以一般abstract关键字和virtual是一起出现的。而一般含有抽象方法的类一般我们叫他虚类。

标签:end,方法,overload,virtual,override,TBaseClass,aObj,procedure
来源: https://www.cnblogs.com/CipherLab/p/15815176.html