强制转型和类型转换

参考: http://www.programmersheaven.com/user/pheaven/blog/41-Understanding-Casting-and-Coercion-in-C/

这篇文章中关于他们的区别讲的清楚了,我要做的是提炼下重点,另外从CLI上说说区别

   1: public class A
   2:     {
   3:         int X;
   4:         public virtual void F(){}
   5:     }
   6:     
   7:     public class B : A
   8:     {
   9:         int X;
  10:         int Y;
  11:         public override void F(){}
  12:     }

编译通过

关于继承

B继承了A的结构然而还是可以定义与A同名称的变量,原因在与方法表中定义不一样,请看变量在v-table中的定义

image

对于方法表则不同

image

B中的方法表会在编译时在方法表对应覆写的方法 即给原来的地址加上对应的Offset(偏移地址)

两者为何不同呢?

原因在于:对于方法而言,会调用Object上的一个方法首先会查找是否存在该方法,如果不是没有任何修饰符而重名的话,则会有编译器错误。

这也是多态的基础

A a = new B(); // 类型转换

int i = (int)3.5; // 强制转换

CLI上的区别

关于CLI上对于两者的描述为

Unlike coercion, a cast never changes the actual type of an object nor does it change the representation.

意为,与强制转换不同,类型转换从不改变对象的实际类型,也从不改变他所引用的对象

关于IL层次上面的描述:

http://www.cnblogs.com/yuyijq/archive/2008/07/13/1241832.html

posted on 2008-07-28 00:27 xwang 阅读(...) 评论(...) 编辑 收藏

导航

统计