我真的不明白虚方法有什么好处(33分)

  • 主题发起人 主题发起人 千中元
  • 开始时间 开始时间

千中元

Unregistered / Unconfirmed
GUEST, unregistred user!
你明白么?请举个例子
 
虚方法给出一种共性的方法实现,由子类各自重载各自的入口,演变出各自的特点。
在DELPHI的SOURCE中这种例子比比皆是,比如TCUSTOMEDIT.CLEAR;
被TEDIT,TMEMO....分别OVERRIDE了各自的不同版本。
 
可以重载,这个好处还小吗?
 
推举两本书:

《面向对象的程序设计与C++教程》张国峰 编著 电子工业出版社——经典教材

《C++编程思想》(美)Bruce Eckel 刘宗田 等译 机械工业出版社——不多见的好书!
 
唉, 我都不知道该对 千中元 说什么了。
 
SuperMMx,我真的朽木不可雕了?sigh..

敏哥,
俺记住了,等以后遇到就买
 
kang,
不用虚方法的虫灾和用虚方法的重载各自的适用情况?
 
这个涉及所谓前期联编和后期联编的问题

简单的说 ,不用虚方法
运行时具体调用哪个过程是编译时确定

否则
是运行时确定

今天没时间了
下次你碰到我
再跟你讲
 
.
我也不太明白,但对JAVA的接口和COM地接口知道一点,是不是
虚方法和他们有些类似哪?
比如说,一个JAVA对象要想处理鼠标事件那么他一定要实现MOUSELISTNER
接口并登记该接口,大体包括
leftclicked,rightclicked之类的方法,那么事件的源当发生就知道
如何传递这个消息给对象了。
。。不明白
 
有了虚方法就能 实现多态性
提供一个公共的调用接口
而不必要关心 每个的具体实现.
就比如CREATE 所有的类的实现都用CREATE
但它们的具体实现是不同的,但使用这个公共接口
的时候,并不需要知道他们有些什么不同.
<DELPHI4技术内幕>中 在介绍多态中
有个图形显示的例子
 
Java不懂的说,COM的接口可以理解为纯虚方法,即本身没有一点实现
 
接口接口,他只是一个接口!
只是一个自来水龙头,至于接在什么管子上,
那就看你得了,不过管子的规格是确定的(指定的接口)!
 
不用虚方法的话,则父对象的原有方法被覆盖。关于这个的详细说明,
《Delphi 4编程技术内幕》里有。
 
设想这样一种场景:
你的一个朋友通过电话向你咨询电脑问题,你对他说:"第一步,打开电脑....".

这里的"打开"在你的头脑中就是一个虚方法,因为你并不知道他将
如何打开电脑,是按了一下左边的按钮还是按了一下下面的按钮.但
是你知道电脑可以被打开,具体的打开方法依不同的电脑实例而定.

试想如果不用虚方法你将如何说:
你的电脑是什么型号?
我去查一下它的打开方法,请稍等.
(如果你查到了)请将想机箱下方标着POWER的按钮按一下.

很麻烦不是吗? 当然还算幸运你查到了它的打开方法,如果你查不到,
或者说你朋友的电脑还没有买来(可以说是虚电脑),那你如何来说这
话呢.

这就是虚方法的好处和必要性.
 
通过几个实例详细说明一下岂不更好!?
 
虚拟与动态对象方法
virtual 和 dynamic 这两个关键字的语法相同,而且使用的结果也相同。但是
编译器用来实现滞后联编而使用的机制不同。
虚拟对象方法基于一个虚拟对象方法表(vmt,或vtable)。虚拟对象方法表
示对象方法的地址数组。为调用虚拟对象方法,编译器产生代码来跳到储存在虚拟
对象方发表内“第n个”时间短的地址。
虚拟对象方法表提供了方法调用的快速执行方式,但是其缺点是,对每个虚拟方
法的每个子类都需要一个入口,甚至对那些在子类中没有重载的对象方法也需要入
口,对于层次多的类,入口传遍各个层次的类,会占用较多内存。
动态对象方法调用使用唯一数值来表示对象方法。相应函数的寻找与虚拟方法
相比要慢。但其长处在于,当子类重载对象方法时,动态对象方法的入口只在子类
中传播。这时候,比虚拟对象方法节省内存,但是速度较慢。
总之,这两种方法只是内部表达不同以及速度和内存使用上的稍稍不同。

经验法则:
1、如果某个对象方法,几乎每个子类都要重载它时,生命她为虚拟方法
2、如果某个对象方法不想非常频繁的重载,而为了灵活性需要滞后联编,
声明他为动态方法,特别是在存在大量子类的情况下

3、如果一个对象方法每秒被调用很多次,生命他为虚拟方法,否则,与使用
动态方法相比,没有实质区别。
 
后退
顶部