动态方法覆盖和静态方法覆盖有何区别。

zzybird 2003-09-12 04:56:39
感觉上没什么区别,那为什么还要virtual关键字有何用?
...全文
104 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
lxpbuaa 2003-09-12
  • 打赏
  • 举报
回复
似乎搂住的概念不是太清楚,在Pascal中,没有任何修饰符号的方法都是静态方法(这和C是不同的),动态方法是后缀为dynamic的方法,virtual为后缀的称为虚拟方法。动态方法和虚拟方法可以统称为虚方法。
静态方法和虚方法的内部调用机制有很大不同,另外,引入虚方法的目的是在子类中实现对父类功能的扩展,这是通过在子类中覆盖父类的虚方法来进行的。

—————————————————————————————————
宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
—————————————————————————————————
cow8063 2003-09-12
  • 打赏
  • 举报
回复
1、如果基类不知道如何实现某方法(只有派生类知道),而基类的其他方法又必须使用该方法,则把该方法声明为抽象虚方法-- virtual; abstract;(即C++的纯虚函数)。

  

  2、如果基类能够为某方法提供一种默认实现,但派生类可能完全重写这个实现,则将该方法声明为虚方法-- virtual;并实现默认算法。

  3、如果基类能够且必须提供某方法的部分的实现,而派生类必须提供另一部份的实现,则将该方法声明为非虚方法,并在基类中为其配套提供一个虚方法或抽象虚方法,以允许由基类本身调用和被派生类覆盖。
sundayzhao 2003-09-12
  • 打赏
  • 举报
回复
怎么说呢,好像静态有个虚拟表,编译的时候就已经确定了每个函数的地址。这里面放着所有静态方法的地址,这样程序调用的时候,直接在这里取地址,调用函数就可以了,速度比较快。而且不能被重载。

动态方法,好像编译的时候并不知道每个子类函数的地址,它是根据对象的所属的类动态调用函数,灵活方便,并且提高了速度譬如
a=class
f1:static;
f2:dynatic
b=class(a)
f1;
f2:override;

a1:a
a1:=a.create;
a1.f1 调用a.f1
a1.f2 调用a.f2;

a1:=b.create
a1.f1; 调用a.f1
a2.f2; 调用b.f2

因为a1被宣称为a类的对象,所以对于静态函数他只能调用f1,对于动态函数,
可以动态根据他所属的类来执行。

在网吧里,没有资料,写的不是很明白。






lw549 2003-09-12
  • 打赏
  • 举报
回复
http://expert.csdn.net/Expert/topic/1773/1773517.xml?temp=.2565119
zzybird 2003-09-12
  • 打赏
  • 举报
回复
我说的是类中的静态方法和动态方法。

5,392

社区成员

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

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