读了《你必须知道的.net》的关于继承的本质篇,有以下收获:
1.子类继承父类,那么在创建子对象(为子对象分配内存)的时候,会有以下几点要注意的
(1)如果子类存在"相同"的字段成员或函数成员,且函数不存在覆写(override),那么子
对象中将同时存在父类和子类的"相同"成员,只不过父类的成员被隐藏了.(这里的"相同"
是指:如果字段则类型相同,名字相同;如果函数则返回值类型相同,名字相同,参数相同)
要调用隐藏的成员必须要父类型的引用.
(2)创建子类型对象的过程,先创建字段,从最上层的父类开始,直到自身的字段,如果遇
相同的字段,则隐藏掉(隐藏并不代表不创建,只是调用它需要不同的权限,比如父类型指
针);成员函数的创建有所不同,子对象中保存一个指针,它指向另外一块保存了方法表的
内存块,如果函数被覆写(override),那么只有一个备份,如果是隐藏,则有多个备份,只不
过各个备份的访问权限不一样.
3.例子:
class Base
{
public string str = "baseString";
public string str2 = "baseString2";
public void function1()
{
Console.WriteLine("base function1");
}
public virtual void function2()
{
Console.WriteLine("base function2");
}
}
class Derived : Base
{
public new string str = "derivedString";
public new void function1()
{
Console.WriteLine("derived function1");
}
public override void function2()
{
Console.WriteLine("derived function2");
}
}
static void Main(string[] args)
{
Derived d = new Derived();
Base b = new Derived();
//验证字段被隐藏
Console.WriteLine("隐藏字段测试:");
Console.WriteLine(d.str);
Console.WriteLine(b.str);
Console.WriteLine();
//验证函数被隐藏
Console.WriteLine("隐藏函数测试:");
d.function1();
b.function1();
Console.WriteLine();
//验证函数被覆写
Console.WriteLine("函数覆写测试:");
d.function2();
b.function2();
}
结果如下:
隐藏字段测试:
derivedString
baseString
隐藏函数测试:
derived function1
base function1
覆写函数测试:
derived function2
base function2