回 帖 发 新 帖 刷新版面

主题:看过C#入门经典(第三版)的高手请进

在书中176页构造函数的执行序列中例子如下:
public class MyBaseClass
    {
        public MyBaseClass()
        {
            Console.WriteLine("MyBaseClass()");
        }
        public MyBaseClass(int i)
        {
            Console.WriteLine("MyBaseClass(int i)");
        }
    }
    public class MyDerivedClass : MyBaseClass
    {
        public MyDerivedClass()
        {
            Console.WriteLine("MyDerivedClass()");
        }
        public MyDerivedClass(int i)
        {
            Console.WriteLine("MyDerivedClass(int i)");
        }
        public MyDerivedClass(int i, int j)
        {
            Console.WriteLine("MyDerivedClass(int i,int j)");
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            MyDerivedClass myObj = new MyDerivedClass(4);
            Console.ReadKey();
        }
    }
其中每个类中的构造函数输出语句是我加上去的,目的是看他们的执行顺序。
这个例子我在运行时的输出结果为:
MyBaseClass()
MyDerivedClass(int i)
也就是说先执行System.Object.Object()构造函数,再执行MyBaseClass.MyBaseClass()构造函数,最后执行MyDerivedClass.MyDerivedClass(int i)构造函数。
但是书上给的说第二步的是执行MyBaseClass.MyBaseClass(int i)构造函数,而不是MyBaseClass.MyBaseClass()构造函数。
用同样的方法验证用base和this关键字时,也和我想象的结果不一样。

请各位高手能否解释一下不知为什么会这样,先谢谢了。

回复列表 (共2个回复)

沙发

object构造函数就不用算作一步了吧

板凳

在默认情况下,子类在初始化是按基类—>子类的顺序初始化;而且调用的是基类的空构造函数;
如果要调用基类的有参构造函数,要显示调用,如:子类有参数构造函数如下
public MyDervieClass(int i):base(i){//}
则如你说的在第2步掉用的是基类的 MyBaseClass(int i){//}构造函数

我来回复

您尚未登录,请登录后再回复。点此登录或注册