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方法就是我们常说的抽象方法,该方法只能有声明而不能有实现部分,一般只是提供给派生类override使用的,所以一般abstract关键字和virtual是一起出现的。而一般含有抽象方法的类一般我们叫他虚类。
标签:end,方法,overload,virtual,override,TBaseClass,aObj,procedure 来源: https://www.cnblogs.com/CipherLab/p/15815176.html