隐藏与虚方法调用
子类要隐藏父类的同名方法,推荐在子类中使用new声明。注意若不使用new关键字,当方法相同时,调用哪个方法由对象变量的类型决定。
class Parent
{
public void HideF()
{
System.Console.WriteLine("Parent.HideF()");
}
}
class Child : Parent
{
new public void HideF()
{
System.Console.WriteLine("Child.HideF()");
//base.HideF(); //调用基类被覆盖的方法
}
}
虚方法:virtual,override,子类可以重写父类方法,当方法相同时,调用哪个方法由对象变量的类型决定。
继承关系下的字段访问:子与父有相同名字的字段,使用哪个,由对象定义时的类型决定,与引用无关(注意以上面方法调用的区别)
继承下的对象创建与销毁
构造函数的目的:初始化成员
子类在创建时,先初始化自身成员(静态字段在实例字段之前初始化),再调用父类的构造函数,上溯到Object,而Object构造函数为空,一般也就看不到了。(IL中可以看到)
类的静态构造函数,不会自动调用基类的静态构造函数。
继承关系下的内存模型
实例字段的布局
静态字段的内存布局
注意静态字段分布在不同的类型表中
继承的虚方法内存布局
虚方法的调用,是在运行时根据对象的真实类型决定,不是在编译时确定的,因此CLR对虚方法调用采用了动态分派(Dispatch)的方法
简单说,按同样的索引查不同的表。
接口的虚方法内存布局

虚方法调用时:
1,CLR先查Iother类型表,知道g()的方法表索引为0
2,再查调用此方法的MyClass1类型所对应的接口偏移表,知道Iother接口在表中的偏移量为6。
3,两个相加(0+6),知道了MyClass1方法表的第7行(从0开始算)为真正要调用的方法。

浙公网安备 33010602011771号