首页 > 试题广场 >

下列代码的运行结果是()?

[单选题]
下列代码的运行结果是()?


  • Base.Func Sub.Func
  • Sub.Func Sub.Func Sub.Func
  • Sub.Func Sub.Func
  • Base.Func Sub.Func Sub.Func
1、首先我们要知道由于sub()继承于base(),所以sub.Func()也继承于base.Func(),如果不重写这个方法,那么sub.Func()=base.Func(),输出Base.Func。但是题目中用override void Func()对基类的方法重写,导致基类中base.Func()被赋值sub.Func(),即base.Func()=sub.Func()
2、再让我们看代码的运行过程,在实例化子类时,先运行基类的构造参数,再运行子类的构造参数(参考c#入门经典),但是基类的构造参数中的方法已经变了,所以相当于运行了两次sub.Func()。最后实例化对象obj再一次调用sub.Func(),共输出了三次sub.Func()
注:这道题主要是类的继承和方法重写及构造参数调用顺序
发表于 2017-09-14 10:32:44 回复(3)
Base obj = new Sub();

运行顺序为:进入Sub()类-运行Sub()构造函数-运行Base()构造函数-运行Sub()中override 重写Func()函数-
输出Sub.Func-继续运行Sub()构造函数-运行Sub()构造函数中的Func()函数-输出Sub.Func-运行obj.Func()-进入Sub()-运行Func()-输出Sub.Func()

如果Sub()中的Func()不加override,则
 运行顺序为:
进入Sub()类-运行Sub()构造函数-运行Base()构造函数-运行Base()构造函数中Func()函数-输出Base.Func-
继续运行Sub()构造函数中的Fun()-输出Sub.Func-运行obj.Func()-进入Base()-运行Func()-输出Base.Func()

若Sub()中保持override,但是实例化如下,则:
Base obj = new Base(); 
运行顺序为: 进入Sub()类-运行Sub()构造函数-运行Base()构造函数-运行Func()-输出Base.Func-运行obj.Func()-
进入Base()类-运行Base.Func()-输出Base.Func

若实例化方式为:
Sub obj = new Sub(); 

则:

进入Sub()类-运行Sub()构造函数-运行Base()构造函数-运行Sub()中override 重写Func()函数-输出Sub.Func-继续运行Sub()构造函数-
运行Sub()构造函数中的Func()函数-输出Sub()-运行obj.Func()-进入Sub()-运行Func()-输出Sub.Func()



发表于 2017-12-26 01:57:07 回复(4)
怎么会有三次输出啊,怎么想都想不通啊,求大神啊。
发表于 2017-09-01 16:18:38 回复(2)
1.首先调用父类的构造函数,输出Base.Func
2.条用子类的构造函数,输出Sub.Func
3.调用方法 由于子类的方法覆盖父类输出Sub.Func
发表于 2017-08-15 20:46:51 回复(5)
有子类覆盖的前提下,基类不会再 使用自身的虚方法了。参考Servlet加载器
发表于 2018-02-28 14:20:13 回复(2)
其实要注意的就是new子类的时候,其构造方法也会调用父类的构造器,而在父类中构造器中也有一个Fun()函数,并且该函数再子类中已经重写了,所以父类构造器中的那个Fun方法内容是子类的那个方法一样的。然后调用完父类的构造方法后就要执行自己的Fun方法 最后用obj对象再去调用Fun方法,这是第三次调用!而且方法内容一样😊
发表于 2019-07-31 23:52:36 回复(0)
虚方法被重写后,父类的构造函数也是调用虚方法,除非用base显式调用
发表于 2017-09-04 23:14:37 回复(0)
第一步:实例化sub时会先调用父类的构造函数再调用自己的构造函数,此时会执行两次func方法,由于fun方法被子类重写了,所以两次输出是sub.func, 第二步调用func方法,执行输出sub.func。 所以三次输出都是一样的,选b
发表于 2022-02-11 14:45:15 回复(0)
<p>我们知道,构造方法是用来初始化类对象的。如果在类中没有显式地声明构造函数,那么编译器会自动创建一个默认的构造函数;并且这个默认的构造函数仅仅在没有显式地声明构造函数的情况下才会被创建创建。</p><p><br></p><p> 构造函数与父类的其它成员(成员变量和成员方法)不同,它不能被子类继承。因此,在创建子类对象时,为了初始化从父类中继承来的成员变量,编译器需要调用其父类的构造函数。如果子类的构造函数没有显示地调用父类的构造函数,则默认调用父类的无参构造函数,至于什么事显式调用,在下面会详细说明!关于子类中构造函数的构造原则,总结如下,欢迎大家指导与批评。</p><p><br></p><p> 1.父类没有声明构造函数</p><p><br></p><p> (1)子类也没有声明自己的构造函数,则父类和子类均由编译器生成默认的构造函数。</p><p><br></p><p> (2)子类中声明了构造函数(无参或者带参),则子类的构造函数可以写成任何形式,不用顾忌父类的构造函数。在创建子类对象时,先调用父类默认的构造函数(编译器自动生成),再调用子类的构造函数。</p><p><br></p><p> 2.父类只声明了无参构造函数</p><p><br></p><p> 如果子类的构造函数没有显式地调用父类的构造,则将会调用父类的无参构造函数。也就是说,父类的无参构造函数将会被隐式地调用。</p><p><br></p><p> 3.父类只声明了带参构造函数</p><p><br></p><p> 在这种情况下,要特别注意。因为父类只有带参的构造函数,所以如果子类中的构造函数没有显示地调用父类的带参构造函数,则会报错,所以必需显示地调用。关于构造函数的显示调用,参见下例。</p>
发表于 2021-08-31 11:07:09 回复(0)
class Base
    {
        public Base()
        {
            Func();
            System.Console.WriteLine("Base()");
        }

        public virtual void Func()
        {
            System.Console.WriteLine("Base.func()");
        }
    }

    class Sub : Base
    {
        public Sub()
        {
            Func();
            System.Console.WriteLine("Sub()");
        }

        public override void Func()
        {
           Console.WriteLine("Sub.Func");
        }
    }

    class Inherit1
    {
        public static void Run()
        {
            Base sub = new Sub();
            sub.Func();
            // 输出结果
            // Sub.Func => Sub重载了Func,调用Sub.Func
            // Base() => 先调用Base无参构造函数 => https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/classes-and-structs/using-constructors
            // Sub.Func
            // Sub() => 再调用Sub无参构造函数
            // Sub.Func => 调用Sub.Func
        }
    }
重载的图例:

编辑于 2021-03-28 14:38:43 回复(0)
这应该是拆箱吧
发表于 2019-06-15 10:12:30 回复(0)
子类如果重写父类方法,构造子类时父类的方法已被改变,当构造父类时,不会改变父类方法。
编辑于 2018-12-11 22:05:43 回复(0)
本题四个选项都是不对的。
sub继承了base,并且用override重写了base的虚方法,此时在main里面调用sub的func的时候,不会再调用base里面的func方法。除非sub里面没有重写func才会调用base的func方法。
发表于 2018-10-23 06:00:27 回复(0)
在实例化子类时,先运行基类的构造参数,再运行子类的构造参数(参考c#入门经典),但是基类的构造参数中的方法已经变了,所以相当于运行了两次sub.Func()。最后实例化对象obj再一次调用sub.Func(),共输出了三次sub.Func()
发表于 2018-09-05 11:11:58 回复(0)
先执行父类无参构造再执行子类无参构造
发表于 2018-07-13 00:13:21 回复(0)

这题考察类的继承,构造方法的运行过程和方法的重写。

发表于 2018-06-27 23:54:13 回复(0)
实例化的时候,要执行子类和父类的构造函数
发表于 2018-05-17 13:21:22 回复(0)
明明点了A怎么选上了B
发表于 2018-04-07 15:22:18 回复(1)
认真看题
发表于 2018-04-07 01:09:50 回复(0)
注意构造函数的调用顺序 注意是用ovrriable重写父类方法 故base.func=sub..func
发表于 2018-04-04 17:43:36 回复(0)