Blue
Red
Green
Orange
Voilet
Slate
Dark

覆盖基类方法是不是基类方法必须定义为虚拟方法呢?(50分)

C

Croba

Unregistered / Unconfirmed
GUEST, unregistred user!
如题:覆盖基类方法是不是基类方法必须定义为虚拟方法呢?

如果是,那为什么我的一个TMyDBEdit类继承自TDBEdit,TDBEdit中并没有一个DoExit的虚拟方法,只是它的祖先类TWinControl中有一个DoExit的方法,但也不是虚拟方法,那我在我的自定义控件TMyDBEdit中为什么可能覆盖祖先类TWinControl中的DoExit??
谢谢!
 
C

cpilq

Unregistered / Unconfirmed
GUEST, unregistred user!
不懂!但是我还是站在这里等待别人的回答!因为我也想知道!
 
N

Netsoft

Unregistered / Unconfirmed
GUEST, unregistred user!
不一定是虚拟类才可以覆盖的呀,
只要在父类出现了的(子类可访问到的)函数,
都可以覆盖的,
虚拟类的意思是在父类里是没有任何实际操作的,
到了子类进行覆盖后才有,典型的就是TGraphic类
呵呵~~~~~~~~~~~~~~~~~~~~~~
 
C

Croba

Unregistered / Unconfirmed
GUEST, unregistred user!
>>>虚拟类的意思是在父类里是没有任何实际操作的
这不是抽像类的意思吗?
 
R

rockswj

Unregistered / Unconfirmed
GUEST, unregistred user!
虚拟是virtual抽象是abstract,父类声明为virtual后子类可以重载,实现多态。
abstract表示只声明没有实现,以后子类实现。
 
V

vmao

Unregistered / Unconfirmed
GUEST, unregistred user!
虚方法重载virtual 用 override
基类原来有的方法要覆盖掉用 overload
这两个原理是不一样的!虽然看上去差不多,但本质却完全不同!
 
C

Croba

Unregistered / Unconfirmed
GUEST, unregistred user!
vmao搞错了吧,
override称为虚方法覆盖,不是重载;
overload称为虚方法重载,不是覆盖,它并不属于OOP的概念。
重载意思我懂,但覆盖所指的晚绑定,我还是不能深刻的了解,而且我的例子是非virtual
方法也可以覆盖了,麻烦OOP熟手给个具体的解释,多谢了!!

 
R

renyi

Unregistered / Unconfirmed
GUEST, unregistred user!
还是Java 处理得好
 
V

vb杀手

Unregistered / Unconfirmed
GUEST, unregistred user!
你的问题说得不很清楚。请说清楚一点。。。。。
如果他的祖先类有这个方法,那么他就有这个方法,如果你定义一个具有相同名字的方法而不是覆盖祖先类的方法,你可以用reintroduce
 
L

lichdr

Unregistered / Unconfirmed
GUEST, unregistred user!
動態方法也可以override
 

雪中漫步

Unregistered / Unconfirmed
GUEST, unregistred user!
其实可以简单的这样理解:
覆盖是完全相同的函数(包括名称,参数都相同)
重载是函数名相同,参数不同。它们和是否virtual没有必然联系。
如果在父类中有virtual,那么从该类直接或间接派生出去的子类如果也定义了相同的函数,会自动调用派生类的同名函数,而不会调用父类的!
 
X

xuxiaohan

Unregistered / Unconfirmed
GUEST, unregistred user!
你定义的新方法的名称跟父类的方法名称相同和参数相同,就已经覆盖了父类的方法,包括是虚拟的,静态的,如果是参数不相同的,必须加reintroduce!
 
C

Croba

Unregistered / Unconfirmed
GUEST, unregistred user!
那非virtual和非dynamic方法在继承子类中能不能覆盖,覆盖的意思在这儿与继承基类方法是不是同种意思。谢谢!
 
5

52free

Unregistered / Unconfirmed
GUEST, unregistred user!
而且我的例子是非virtual方法也可以覆盖了<<<不对,那只能是重载,静态的方法不能被覆盖
给个例子加深这种理解
TBasicF=class
procedure Show;
end;
TF=class(TBasicF)
procedure Show;
end;
{ TBasicF }

procedure TBasicF.Show;
begin
showmessage('basic show')
end;

{ TF }

procedure TF.Show;
begin
showmessage('TF show')
end;

var
F:TBasicF;
begin
F:=TF.Create;
F.Show;
end;

F.show的结果是'basic show'

如果将基类的show方法定义为虚方法
TBasicF=class
procedure Show;virtual;
end;
TF=class(TBasicF)
procedure Show;override;
end;
var
F:TBasicF;
begin
F:=TF.Create;
F.Show;
end;
则结果是'TF Show'

这就是说如果如果一个类和它的子类都定义了滞后联编的一个方法
则可将这个方法应用于一个通用的基类的变量,就是F
它既可以引用TBasicF的对象也可以引用TF的对象
根据当前实际的对象的类确定调用的对象方法




 
T

Tassadar

Unregistered / Unconfirmed
GUEST, unregistred user!
自己测试一下就知道了
父类的方法是不是virtual,子类都可以定义相同的方法覆盖,
但是行为却有点区别,分别为前期绑定和后期绑定。
假如有一个父类TFarther和子类TChild
都有一个方法test
如果父类的方法是virtual或者是dynamic并且override了
子类的实例 (child as TFarther).test;
所做的都是TChild.test;
假如父类的方法是static的
所做的就是TFarther.test;
 
C

Croba

Unregistered / Unconfirmed
GUEST, unregistred user!
越来越晕了~~~~
 
C

Croba

Unregistered / Unconfirmed
GUEST, unregistred user!
实现结果我知道了,怎么样深刻的理解和这样做又哪些意义勒?
 
L

lichdr

Unregistered / Unconfirmed
GUEST, unregistred user!
方法也可以分層呀。可以去inherited.
 
5

52free

Unregistered / Unconfirmed
GUEST, unregistred user!
意义在于你只要对一个通用的对象下达指令,它就会按实际的步骤去操作
比如说有一个
画图的基类它定义一个抽象的方法draw
现在从它继承两个子类
一个画圆,一个画方
现在你只要定义基于基类的通用变量
你现在就可以向它发出draw这个命令至于它是画圆,还是画方
完全取决于它引用的是哪一个子类的对象

说到底---你可以用一个通用的命令指挥对象做不同的操作
 
N

Netsoft

Unregistered / Unconfirmed
GUEST, unregistred user!
To Croba 这不是抽像类的意思吗?
老兄呀,也可以说是抽象类的,具体看你写代码啦。不写Abstract一样可以啦,当虚拟函数看咯~~~~~~~

我再把我认为的重载与虚拟的概念说一遍:有不对之处还请多多指教
重载是指一个函数可以和同一作用域中的其他函数具有相同的名字(我想这是许多人的误区),但是这些同名函数的参数类型、参数个数、返回值等都可以不同。普通函数(一定是可以访问的啦,普遍是指非 Private 类型)都可以重载。
虚拟函数在基类中补声明成 Virtual,子类可以重新定义这个函数实现自己比基类更为专门的特定功能。最明显的例子就是 TGriphic类啦。
呵呵~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
顶部 底部