强制转型和类型转换
参考: 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中的定义
对于方法表则不同
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