初学者问题,关于virtual继承后面的abstract的用法。

jfzj1201 2003-08-21 09:56:14
program Polymorphism;
{$APPTYPE CONSOLE}
users
SysUtils;
type
tshape=class(TObject)
protected Draw; virtual: abstract;
protected Erase;Virtual; abstract;
end;
.........
请问abstract抽象方法的作用以及用法,看不懂。3q for your help~!^^
...全文
347 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
DJ_KK 2003-08-21
  • 打赏
  • 举报
回复
dynamic和virtual之异同

  dynamic和virtual不仅作用相同,声明的语法也相同。它们唯一不同的在于内部机制。virtual的实现是通过虚拟方法表(VMT,virtual method table,和C++中的vtbl很相似)实现的,在类中每一个虚拟函数在VMT中都要占用一个位置。VMT的一个不利之处在于,不论派生类中有没有重载基类中的方法,都不会改变VMT的大小,这样VMT中很多位置实际上是重复的,在一个比较大的类库中,势必要浪费不少内存。dynamic的实现方法有所不同,它不是通过VMT中指向实际方法的指针,而是通过索引来实现的,这样只有派生类中重载了的方法才会占据实际的表项,从而节省了内存。dynamic的不利之处在于,由于dynamic的方法表格(相对于VMT,dynamic的方法表格可以称为DMT)在基类和派生类中的大小不一定相同,同一个dynamic method的表项位置也不一定相同,所以dynamic方法必须动态查找,调用效率就低一些。相比而言,在基类和派生类中的virtual method在VMT中的表项位置总是固定的,所以调用很快。

  总之,dynamic的优点就是virtual的缺点,dynamic的缺点也就是virtual的优点。你可以按照自己的需要来决定究竟用virtual还是用dynamic。不过,dynamic和virtual的区别可能对于编写application framework的程序员或者对那些效率问题至关重要的程序来讲才比较重要,对于一般的应用,虚拟方法不会很多,程序规模也不是很大的情况,一般用virtual就够了。

  Object Pascal也支持abstract method,只要在函数声明中加上abstract关键字即可。当然了,只有virtual或者dynamic方法才能够声明为 abstract。只是和C++中不同,你可以建立abstract class的实例,并且调用它的abstract方法:

type

TTest=class

proceudre f:virtual;abstract;

end;

procedure TForm1.FormCreate(Sender:TObject);

var

t: TTest;

begin

t := TTest.Create;

t.f;

t.Free;

end;

  尽管你会得到一个编译器警告Constructing instance of 'XXXX' containing abstract method 'XXXX.XX',但是程序仍然可以运行,只是当调用t.f的时候会产生一个运行时刻异常。不知道Object Pascal为什么这样安排,在C++中,构造一个含有抽象方法的对象无论如何都不会成功的。Object Pascal为什么要这样处理呢?我不知道。

你可能没有注意到一个关于abstract的小问题:下面的代码会有问题吗?

type

TTest=class

procedure f;virtual;abstract;

end;

TTest2=class(TTest)

procedure f;override;

end;

implementation

procedure TTest2.f;

begin

inherited;

ShowMessage(‘Test2.f!’);

end;

procedure TForm1.FormCreate(Sender:TObject);

var

t : TTest2;

begin

t := TTest2.Create;

t.f;

t.Free;

end;

  在Delphi 5中,上面的代码会产生一个Abstract异常。关键在于inherited调用了基类的abstract方法。而在Delphi6中,编译器能够自动识别这种情况,从而不会导致问题。显然,Delphi 6中的这种增强更有利于OO的封装特性,你可以放心大胆的使用inherited,而不用担心基类的方法是否abstract。

DJ_KK 2003-08-21
  • 打赏
  • 举报
回复
When a method is declared as abstract in an ancestor class, you must surface it (by redeclaring and implementing it) in any descendant component before you can use the new component in applications. Delphi cannot create instances of a class that contains abstract members. For more information about surfacing inherited parts of classes, see Creating properties and Creating methods.

中文名称:Delphi 7完美经典

http://www.huachu.com.cn/photo/2003/BB04672130c.jpg

出版社 : 中国铁道出版社
作者  : 江义华/
出版日期: 2003年7月
综合评价:
国标编号:ISBN 7-113-05241-X/TP.931
条形码 :9787113052416
字数  :989千字  
印张  :41.75
印数  :1-5000   
页数  :654
开本  :787*1092 1/16
版别版次:2003年7月第一版第一次印刷
内容简介:
本书特色
层次清晰、语言通俗、语法简练、以实用性为第一位。
深入剖析了Object Pascal程序语言,包括指针、数据结构以及有关Override 和Overload函数的语法等。
对面向对象的观点详述了Delphi VCL组件的属性、方法及事件,且在数据库设计方面辅以应用的范例。
实例配有光盘,快速引导您踏入Delphi程序开发领域。
适合想要深入了解Delphi程序设计的专业设计师,对一开始就想打好Delphi程序设计基础的初学者也非常适用。

目录 :
第0章 认识Delphi

0-1 前言
0-2 Delphi简介
0-3 进入Delphi7
0-4 退出Delphi

第1章 常用的窗口工具

1-1 窗体(Form)
1-2 代码编辑器(Code Editor)
1-3 代码浏览器(Code Explorer)
1-4 组件面板(Componet Palette)
1-5 对象检视器(Object Inspector)
1-6 快捷工具栏(Speed Menu)
1-7 项目管理器(Project Manager)
1-8 桌面工具栏(Desktops Tollbar)
1-9 图像编辑器(Image Editor)
1-10 对象浏览器(Object TreeView)
1-11 关联选项卡(Digram Page)

第2章 常用的菜单

2-1 File菜单
2-2 Edit菜单
2-3 Search菜单
2-4 View菜单
2-5 Project菜单
2-6 Run菜单
2-7 Tools菜单
2-8 Windows菜单

第3章 集成开发环境的改变

3-1 Delphi集成开民环境介绍
3-2 操作菜单方面的改进
3-2-1 外面方面的改变
3-2-2 内容方面的改变
3-3 对象检视器方面的改进
3-4 组件面板的改进
3-5 代码编辑器的改进
3-6 设计陈列室的改进
3-7 编译信息的显示
3-8 调试器方面的改进
3-8-1 Watch List改进
3-8-2 Debugger选项的改进
3-8-3 Run Parameters对话框的改进

第4章 Delphi Object Pascal的初步印象

4-1 面向对象程序概论
4-1-1 类
4-1-2 对象
4-1-3 继承
4-1-4 封装
4-1-5 信息
4-2 Delphi项目结构及窗体的建立
4-2-1 GUI模式的项目
4-2-2 Console模式的项目
4-3 Object Pascal程序结构
4-3-1 项目程序(Program)的结构
4-3-2 单元程序(Unit)的结构
4-4 如何完成一个简单的窗体程序

第5章 简单的常用指令介绍

5-1 TLabel类对象
5-1-1 Caption属性
5-2 TButton类对象
5-2-1 Caption属笥
5-2-2 OnClick事件
5-3 TEdit类对象
5-4 TCanvas类对象
5-5 Showmessage函数
5-6 InputBox函数
5-7 MessageDlg函灵敏

第6章 Delphi与Object Pascal程序的基本概念

6-1 Object Pascal Program程序结构与Delphi项目结构的关系
6-1-1 标头(Heading)
6-1-2 Uses子句
6-1-3 编译指令(Compiler directive)
6-1-4 源代码区(begin end)
6-2 Unit程序结构与窗体的关系
6-2-1 Unit代码结构
6-2-2 语句(Statement)
6-2-3 Unit间Use的状况
6-3 数据类型与定义变量
6-3-1 数据类型概论
6-3-2 不需要使用type声明的数据类型
6-3-3 必须使用type声明的数据类型
6-3-4 定义变量
6-3-5 变量的作用域
6-3-6 定义常量
6-3-7 变量的类型转换(Typecast)
6-4 Object Pascal的运算符(Operator)
6-4-1 设置运算符(assign Operator)
6-4-2 算数运算符(Arithmetic Operator)
6-4-3 关系运算符(Relational Operator)
6-4-4 布尔运算符
6-4-5 集合运算符
6-4-6 字符串运算符
6-4-7 位逻辑运算符
6-4-8 运算符优先级
6-5 流程控制
6-5-1 语句的基本概念
6-5-2 表达式语句(Expression-Statement)
6-5-3 流程控制语句
6-5-4 可视化程序与嵌套程序
6-6 数组与指针
6-6-1 数组类型
6-6-2 指针类型
6-6-3 浅谈指针与数据结构
6-7 程序与函数(Procedures and Functions)
6-7-1 函数的意义与优点
6-7-2 函数的分类与效用
6-7-3 自定义函数使用方法概述
6-7-4 函数的声明、定义及其实现
6-7-5 参数传递方式
6-7-6 声明修饰字
6-7-7 常用的内建函数

第7章 Object Pascal面向对象设计

7-1 类和对象
7-1-1 类(Class)与对象(Object)的基本概念
7-1-2 对象的构造与类的关系
7-2 类的声明与对象的定义
7-2-1 类的声明与对象的实现
7-2-2 对象的构造与析构
7-3 类成员的封装等级与可见度
7-3-1 封装的意义
7-3-2 Object Pascal类成员的封装等级
7-3-3 以实例说明类成员封装等级的可见度
7-3-4 开头不加保留字的类成员
7-3-5 成员封装等级的变更法则
7-4 类成员的定义与实现
7-4-1 字段(Field)与对象引用(Object Reference)的实现
7-4-2 方法(Method)
7-4-3 属性(Property)
7-5 类的继承
7-5-1 继承的意义与优点
7-5-2 子类成员的存在方式
7-6 成员函数的Override及 Overload
7-6-1 Override 适用的情况——Virtual与 Dynamic的成员函数
7-6-2 Override成员函数的定义语法
7-6-3 Virtual成员函数与动态绑定(Dynamic Binding)
7-6-4 覆盖(Overriding)与隐藏(Hiding)的差别
7-6-5 Override与OVerload的差别
7-7 Abstract成员函数与多态(Polymorphic)
7-7-1 一般纯虚函数的多态实现概念
7-7-2 纯虚函数的定义语法及实现
7-8 Self、AS、is、Sender、Parent、owner、inerited
7-8-1 Self变量
7-8-2 AS运算符
7-8-3 is运算符
7-8-4 Sender
7-8-5 Parent
7-8-6 owner
7-8-7 inerited保留字
7-9 静态成员方法——Class Methods

第8章 异常处理

8-1 异常处理存在的目的
8-2 Object Pascal异常的种类
8-2-1 Delphi内建的异常类
8-2-2 自定义异常类
8-3 触发异常的方法
8-3-1 由程序系统自动触发
8-3-2 使用Raise指令触发
8-4 处理异常情况
8-4-1 try…finally…end语法说明
8-4-2 ty…except…end语法说明

第9章 Delphi用户接口设计详述

9-1 基本概念
9-2 TForm的属性
9-2-1 由TComponent继承而来的属性
9-2-2 由TControl继承而来的属性
9-2-3 由TWinControl继承而来的属性
9-2-4 由TScrollingWindControl继承而来的属性
9-2-5 由TCustomForm继承而来的属性
9-3 TForm的方法
9-3-1 由TObject继承而来的属性
9-3-2 由TPersistent继承而来的属性
9-3-3 由TComponent继承而来的属性
9-3-4 由TControl继承而来的属性
9-3-5 由WinControl继承而来的属性
9-3-6 由TScrollingWinControl继承而来的属性
9-3-7 由TCustomForm继承而来的属性
9-3-8 由TForm继承而来的属性
9-4 TForm的事件
9-4-1 由TControl继承而来的属性
9-4-2 由TWinControl继承而来的属性
9-4-3 由TCustomForm继承而来的属性
9-5 TLabel的类成员
9-5-1 TLabel的属性
9-5-2 TLabel的方法

第10章 标准组件介绍及实作范例

10-1 Frames组件
10-2 MainMenu组件
10-3 PopuMenu组件
10-4 Label组件
10-5 Edit组件
10-6 Memo组件
10-7 Button组件
10-8 CheckBox组件
10-9 RadioButton组件
10-10 ListBox组件
10-11 ComboBox组件
10-12 ScrollBar组件
10-13 GroupBox组件
10-14 RadioGroup组件
10-15 Panel组件
10-16 ActionList组件

第11章 TApplication与TScreen类介绍及应用

11-1 TApplication类
11-1-1 TApplication类对象常用的属性
11-1-2 TApplication类对象常用的方法
11-2 TScreen类

第12章 高级组件介绍

12-1 Additional选项卡中的常用组件
12-1-1 TBitBtn组件
12-1-2 TMaskEdit组件
12-1-3 TImage组件
12-1-4 TShape组件
12-2 Win32选项卡中的常用组件
12-2-1 TPageControl组件
12-2-2 TImageList组件
12-2-3 TRichEdit组件
12-2-4 TDateTimePicker组件
12-2-5 TStatusBar组件
12-3 System选项卡中的常用组件
12-3-1 TTimer组件
12-4 Dialogs选项卡中的常用组件
12-4-1 TOpenDialog组件
12-4-2 FTontDialog组件
12-4-3 TColorDialog组件

第13章 封装Delphi7开发的应用程序

13-1 安装Borland的InstallShiled程序
13-2 利用InstallShield封装 Delphi7开发的程序
13-2-1 InstallShield环境界面简介
13-2-2 封装一个简单的Delphi项目

第14章 数据库概念及SQL指令介绍

14-1 数据库基本概念
14-1-1 数据库结构
14-1-2 开放数据库连接协议(ODBC)
14-1-3 SQL Explorer
14-2 结构化查询语言SQL
14-2-1 CREATE语句
14-2-2 ALTER TABLE语句
14-2-3 DROP语句
14-2-4 SELECT语句
14-2-5 INSERT、UPDATE语句
14-2-6 DELETE语句
14-3 SQL指令高级使用
14-3-1 UNION运算
14-3-2 JOIN运算
14-3-3 特殊运算符
14-3-4 子查询(Sub Query)

第15章 Delphi数据库程序基础

15-1 Delphi各种数据库连接设置
15-1-1 建立dBase、Paradox连接
15-1-2 建立Access连接
15-1-3 建立MSSQL连接
15-1-4 建立MySQL连接
15-2 Delphi的Database Desktop使用方法
15-2-1 字段定义
15-2-2 输入数据
15-2-3 设置BDE数据库别名与连接数据库

第16章 Delphi数据库程序设计——使用BDE组件

16-1 TDataSet组件
16-1-1 TDataSet组件常用的属性
16-1-2 TDataSet组件常用的方法
16-1-3 TDataSet组件常用的事件
16-2 TTable组件
16-2-1 TTable组件常用的属性
16-2-2 TTable组件常用的方法
16-3 TQuery组件
16-3-1 TQuery组件常用的属性
16-3-2 TQuery组件常用的方法
16-4 TDataModule组件
16-5 TDatabase组件
16-5-1 TDatabase组件常用的属性
16-5-2 TDatabase组件常用的方法
16-5-3 TDatabase组件常用的事件
16-6 综合范例
16-6-1 员工管理系统——使用TTable组件
16-6-2 员工管理系统——使用TQuery组件
16-6-3 订单管理系统——使用TTable组件
16-6-4 订单系统——使用TQuery组件

第17章 数据程序设计——使用Delphi组件

17-1 TADOConnection组件
17-1-1 TADOConnection组件常用的属性
17-1-2 TADOConnection组件常用的方法
17-1-3 TADOConnection组件常用的事件
17-2 TADOCommand组件
17-2-1 TADOCommand组件常用的属性
17-2-2 TADOCommand组件常用的方法
17-3 TADODataSet组件
17-3-1 TADODataSet组件常用的属性
17-3-2 TADODataSet组件常用的方法
17-3-3 TADODataSet组件常用的事件
17-4 TADOTable组件
17-4-1 TADOTable组件常用的属性
17-4-2 TADOTable组件常用的方法
17-5 TADOQuery组件
17-6 综合范例
17-6-1 客户管理系统——使用TADODataSet组件
17-6-2 客户管理系统——使用TADOTable组件
17-6-3 客户管理系统——使用TADOQuery组件
17-6-4 订单管理系统——使用TADOTable组件
17-6-5 订单系统——使用TADOQuery组件

第18章 数据感知组件

18-1 TDBText组件
18-2 TDBEdit组件
18-3 TDBMemo组件
18-4 TDBImage组件
18-5 TDBListBox组件
18-6 TDBComboBox组件
18-7 TDBLookupListBox与TDBLookupComboBox组件
18-8 TDBNavigator组件
18-9 TDBGrid组件

第19章 设计Delphi数据库报表

19-1 设计报表的基本观念
19-1-1 报表的组成
19-1-2 报表的主体组件——TquickRep
19-1-3 建立第一个报表程序
19-2 QuickReport中可打印出组件
19-2-1 TQR系列组件介绍
19-2-2 TQRDB系列组件介绍
19-3 综合范例
19-3-1 一般表达报表范例
19-3-2 标签式报表范例
19-3-3 主/明细报表范例
19-3-4 一般表达式附图片报表范例
19-3-5 分组式报表范例——打印多色报表
19-3-6 报表输出及输出范例

附录 Kylix程序安装及转换

http://lib.verycd.com/2005/02/07/0000038314.html

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧