柚子Nan--回归原点

Everything can be as easy as you like or as complex as you need.
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

为什么Class设计时,不把所有的方法都默认为virtual

Posted on 2004-10-09 09:37  柚子Nan  阅读(1444)  评论(9)    收藏  举报

序言:好像在上学的时候,一个老师讲面向对象这门课程,听得云里雾里的,为什么要讲这么多东西?根本都用不到,完全是在创造一种新的规则而已(说到这里,抑制不住地就想多说2句,上学这么多年,每次学到一门新的课程,例如、物理、化学、数学等总是首先给出一堆定理、公式,然后是例题,最后是练习。在学校的时候好学生的定义是什么?成绩好!成绩是怎么好的?各科的成绩都好,为什么呢?他们最大限度的理解了所谓的定理和公式,至于是否真正学到了,而且是要学什么?不得而知。)


废话到此,言归正传:在设计类的时候,用到了关键字Virtualvirtual 关键字用于修改方法或属性的声明,在这种情况下,方法或属性被称作虚拟成员。虚拟成员的实现可由派生类中的重写成员更改。调用虚方法时,将为重写成员检查该对象的运行时类型。将调用大部分派生类中的该重写成员,如果没有派生类重写该成员,则它可能是原始成员。

 

默认情况下,方法是非虚拟的。不能重写非虚方法。不能将 virtual 修饰符与以下修饰符一起使用:

static   abstract   override

 

如果方法不是Virtual,编译器就使用声明的引用类型。

 

如果方法是Virtual,编译器就会生成代码,在运行时检查引用指向哪个实例,然后确定这个实例属于哪个类,并调用相应的方法。一般情况下,都应该这样子调用的。

 

那么为什么不把所有的方法都默认为虚拟的呢?有三个方面的考虑 

1、性能:在调用虚拟函数时,需要在运行期间进行检查,确定需要调用哪个重写的方法。对于非虚拟函数,这些信息可以在编译时获得(编译器可以把相关的重写方法与引用声明的类型联系起来),显然,运行时的外部检查会降低性能。这种损失是很小的,虚拟函数在内部执行,这意味着他不再涉及到外部的间接访问级别,但是如果在一个处理器非常密集的大型应用程序中,这种情况每秒发生百万次,因此,如果方法显式的声明为虚拟,就只能按照虚拟方式运行。

2、设计:在设计一个类时,有时其中有一些方法从来不需要重写。这是很常见的情况,特别是那些主要用于在类的内部有其他方法是用的方法,或者方法的执行方式反映了类的内部设计。

3、版本问题:虚拟方法可能会产生与基类的新版本冲突的问题。