创建类对象和声明变量

img


我想问下,为什么对象o不能调用Teach方法,我查看了下o的类型确实是Teacher类型的对象。
不是很理解,我声明对象o是object类,但我给了他一个Teacher类的引用,声明和创建对象之间是什么关系呢?

o对象 虽然声明的是 Tearcher类对象, 但是 o对象本身类型是 object, 公共父类 object ,它是没有子类的方法的访问权限的, 你只有将 o对象 强转成 Teacher对象才能调用 Teacher类对象的成员方法

((Teacher) o).Teach();

因为你的o声明的object类型,虽然你后面写了new Teacher, 这里其实方式了隐式类型转换,或者说向上转型,new Teacher 自动被转成了obejct。
所以o调不到Teacher的方法

简单来说,你可以理解成下面这样

object 是在对象上覆盖一个长宽10✖10的红玻璃
O是是在这个object 这个红玻璃上覆盖了一层 20✖10的绿玻璃

所以你看到是:一部分是红+绿的黄色,另外一部分是O多出的绿色
转换成父类是什么:转换成父类其实就是抽了那层绿玻璃去看,所以你只能看到红玻璃范围的东西,而不能看到绿玻璃范围的东西

至于GetType这种那是override的,override修改的不是玻璃,修改的是对象本身。假设对象上在红玻璃范围里有个洞,你最后还是能看到这个洞

我们这个只是打比方去解释,以方便理解
如果你真想知道why?请看资料《你必须知道的net》---(对象生死,对象内存分布,对象方法表那几个章节)
《Clr via C#》这个书也行,不过这个比前一本难啃点(-------:)毕竟前一本是中文大话版,后面这个就是E文专著了)

补充:

img


这个就能解释你的问题了,他在内存里分布是这样的,鸟有鸟的方法表,鸡有鸡的方法表。类型转换映射的是不同方法表(也就是我前面说的玻璃),至于后面一个问题也能解释了,因为对象的本体还有自己的gc heap,type在这里。虽然换了方法表,但没换本体