A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© ╰┄轩、辕_ヤ 中级黑马   /  2013-10-11 13:45  /  1288 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 ╰┄轩、辕_ヤ 于 2013-10-11 19:07 编辑

c#中,析构函数不能继承,构造函数能不能被继续,为什么,求解析?

评分

参与人数 1技术分 +1 收起 理由
茹化肖 + 1

查看全部评分

4 个回复

正序浏览
张林杰 发表于 2013-10-11 14:33
首先一点:就是每个类(不论子类还是父类)都有一个默认的无参数的构造函数,假如你在类中写了构造函数(不论 ...

多谢,学习到了!
回复 使用道具 举报
基类的构造函数和析构函数不能被继承,
在派生类中,如果对派生类新增的成员进行初始化,就必须针对性根据实际需要加入新的构造函数.
与此同时,对所有从基类继承下来的成员的初始化工作,还是由基类的构造函数来完成,我们必须在派生类中对基类的构造函数所需要的参数进行设置.
同样,对派生类对象的析构工作也需要加入新的析构函数.
回复 使用道具 举报
张林杰 发表于 2013-10-11 14:33
首先一点:就是每个类(不论子类还是父类)都有一个默认的无参数的构造函数,假如你在类中写了构造函数(不论 ...

学习了,TKS.
回复 使用道具 举报
本帖最后由 张林杰 于 2013-10-11 14:55 编辑

首先一点:就是每个类(不论子类还是父类)都有一个默认的无参数的构造函数,假如你在类中写了构造函数(不论有没有参数),则这个默认地无参数的构造函数就消失。
接下来回答:为什么构造函数不能被继承,这个算是语法规范吧,如果构造函数真能被继承,那么子类初始化的时候是直接点出父类的构造函数进行初始化还是调用子类的默认构造函数呢,况且下面要说的语法机制决定了继承父类构造函数是没意义的...
更多内容详见:http://msdn.microsoft.com/zh-cn/library/ms173115.aspx
继续回答:
子类是没有继承父类的构造函数的,只继承了父类的属性和方法,但是new子类的时候,会默认地调用父类的无参构造函数。假如父类中写了新的构造函数(有参数的),则父类中原来那个无参数的构造函数就没了,子类就调用不到了,就报错,这时,解决的办法就是在父类中重新写一个无参数的构造函数,或者在子类中显示调用父类那个有参数的构造函数(即:base(xxx))(当然,假如父类中有无参构造函数,也可以显示调用无参数的构造函数),但不论哪一种,子类在调用完父类的构造函数之后,还是会回来调用自己的构造函数(调试一下就知道),
即子类先调用父类的构造函数再调用子类的构造函数。

下面是一个例子:
  1. class Program
  2.     {
  3.         static void Main(string[] args)
  4.         {
  5.             Student s1 = new Student();//显示调用父类的无参数的构造函数
  6.             //s1.Person();//无法调用父类构造函数,按我理解:点不出来就是没继承
  7.             s1.Name = "张三";//可以调用父类中的属性,继承了        
  8.             Console.WriteLine(s1.Name);//输出"张三"
  9.             Student s2 = new Student("李四");//显示调用父类有参数的构造函数
  10.             Console.WriteLine(s2.Name);//输出"李四"           
  11.             Console.ReadKey();
  12.         }
  13.     }
  14.     class Person
  15.     {
  16.         public Person()
  17.         {
  18.         }
  19.         public Person(string name)
  20.         {
  21.             this.Name = name;
  22.         }
  23.         string name;
  24.         public string Name
  25.         {
  26.             get;
  27.             set;
  28.         }
  29.     }
  30.     class Student : Person
  31.     {
  32.         public Student()
  33.             : base()
  34.         {
  35.         }
  36.         public Student(string name)
  37.             : base(name)
  38.         {
  39.         }
  40.     }
复制代码

评分

参与人数 1技术分 +1 收起 理由
茹化肖 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马