- 1、本文档共9页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
C#继承深入解析
一、继承
既然有继承,就要有父类和子类,来看下面的一段代码:
class Person
{
private int nAge; protected string strName; double douHeight;
public string strEateType; public void Hello()
{
Console.WriteLine(我可以说 Hello!);
}
public void Run()
{
Console.WriteLine(我可以跑!);
}
}
class Student : Person
{
}
然后我在 Main()函数中实例化子类的对象,代码如下: static void Main(string[] args)
{
Student stu1 = new Student();
}
那么在这个过程中内存中发生了些什么呢?
我们先来看 misl 的中间代码,看看那能发现些什么
由此我们可以发现子类继承了父类的所有成员包括Private 和 Protect,并为这些成员开辟了空间来存储。
我们再来实例化我们的子类,然后访问父类的字段和方法,会发现,如下的现象
所以虽然子类为父类的所有成员在堆中都开辟了空间,但是私有成员(Private)和受保护的成员(protected)访问不到。
所以在内存中的情况如下图:
看下面的代码,我们来探究一下在子类中this 关键字和 base 关键字所访问的类的成员有哪些,代码如下:
class Student : Person
{
private string strClass; private string strAddress;
public void Address(string cla, string adre)
{
//这里的 this 关键字调用了子类的成员和父类的非似有成员this.strClass = 五;
this.strAddress = 北京;
this.strName = 子强;
//这里 base 关键字调用了是父类的非似有成员base.strName = 强子;
Console.WriteLine(我是{0}年纪,来自{1}, cla, adre);
}
public void Sing()
{
this.strClass = ; Console.WriteLine(我可以唱歌!);
}
}
所以在子类中 this 关键字和 base 关键字的访问范围的示意图如下:
二,关于子类对象的构造函数和父类构造函数的执行顺序我们分别为父类和子类添加显式的构造函数,代码如下class Person
{
private int nAge; protected string strName; double douHeight;
public string strEateType;
//父类的构造函数public Person()
{
Console.WriteLine(我是父类的构造函数);
}
public void Hello()
{
Console.WriteLine(我可以说 Hello!);
}
public void Run()
{
Console.WriteLine(我可以跑!);
}
}
class Student : Person
{
private string strClass; private string strAddress;
//子类的构造函数public Student ()
{
Console.WriteLine(我是子类的构造函数);
}
}
我们使用 VS 的单步调试,来看父类和子类显式构造函数的执行顺序,如下图(动态图片,可以看到过程):
很容易的可以发现,当创建子类对象的时候
①先调用了子类的构造函数
②调用了父类的构造函数
③执行了父类的构造函数
④执行了子类的构造函数那么为什么会这样呢?
我尝试通过反编译看源码来解释这个原因,但是反编译的结果如下,
没有发现有什么特别的地方可以解释这个原因。最后还是查阅微软的 MSDN 官方文档找到了答案
根据微软官方的代码示例,那么下面的代码的效果也是相同的
//子类的构造函数
public Student ()
{
Console.WriteLine(我是子类的构造函数);
}
//这里的代码和上面的代码效果是相同的public Student()
:base()
{
Console.WriteLine(我是子类的构造函数);
}
也就是说只要在子类显式的声明了无参的构造函数,在实例化子类的对象是,子类的无参构造函数都会去调用父类无参的构造函数。
那么,如果父类没有这个无参的构造函数则会报错。如下面的代码:
class Person
{
priv
文档评论(0)