ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

overload,override,virtual 关键字

2022-01-17 20:33:00  阅读:148  来源: 互联网

标签:end 方法 overload virtual override TBaseClass aObj procedure


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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有