首页 > 试题广场 >

下列代码输出为什么?

[单选题]
下列代码输出为():
class Father{
    public void F() { 
        Console.WriteLine(“A.F”); 
    }
    public virtual void G() { 
        Console.WriteLine(“A.G”); 
    }
}
 
class Son: Father{
    new public void F() { 
        Console.WriteLine(“B.F”); 
    }
    public override void G() { 
        Console.WriteLine(“B.G”); 
    }
}
 
class override_new
{
    static void Main() {
    Son b = new Son();
    Father a = b;
    a.F();
    b.F();
    a.G();
    b.G();
    }
}

  • A.F    B.F    A.G   B.G
  • A.F    B.F    B.G   B.G
  • A.F    A.F    B.G   B.G
  • B.F    B.F    B.G   B.G
推荐
答案选B. A.F B.F B.G B.G
a.F():由于F是普通的方法,a是Father类所以调用Father的F方法,所以输出A.F
b.F():由于F是普通的方法,b是Son类所以调用Son的F方法,所以输出B.F
a.G():由于G是虚函数,并且在Son类中重写了Father类所以调用Son的G方法,所以输出B.G
b.G():b的G可以看成一个普通方法,b是Son类所以调用Son的G方法,所以输出B.G

编辑于 2015-09-24 09:53:25 回复(1)
应该选择B
Son类中的F()方法,前面有个New,表示隐藏了从父类那继承来的方法,也就是子类调不到父类的方法;
Father类中G()方法是个虚方法,Son类重写了Father中的G()方法;
   Son b = new Son();  //创建一个Son对象;
    Father a = b;          //创建一个Father对象,此对象里实际存储的是Son;
    a.F();                    //Father对象调用自己的F(),打印A.F;
    b.F();                    //Son调用自己的F(),因为覆盖了父类的F(),所以显示自己的F();,打印B.F
    a.G();                   //Father里的G()方法是虚方法,被Son重写。a里实际存储的是son,所以调用Son中的G(),打印B.F;
    b.G();                  //调用自己的方法,打印B.G;
所以选B
发表于 2016-08-23 10:08:06 回复(2)

虚类是存在于基类跟子类之间。在C#里基类的成员在子类里是可用的,并且不会出现不希望的错误。在子类里要明确写出是继承的哪个类要重写的是哪个方法。

在C#里,子类可以使用跟父类一样的方法名。

1.基类的方法必须定义为虚类(virtual)

2.如果这个方法在子类里没有加上关键字new或者override,会警告warning而且会当做new关键字来处理

3.如果这个方法在子类里被new修饰,这个方法将被当做主类的独立的方法。

4.如果这个方法在子类里被override修饰,子类将把这个方法代替基类里的这个方法

5.override,virtual和new关键词也能被当做属性,索引和事件
我按自己理解翻译的这几条,觉得就足够说明这道题的问题了
原地址:https://msdn.microsoft.com/en-us/library/6fawty39.aspx
最后答案选B
编辑于 2015-09-25 11:19:13 回复(4)
干脆清晰点:
class ABC
{
    static void Main()
    {

        Son b = new Son();
        Father a = b;
        Father c = new Father();
        a.F();
        c.F();
        b.F();
        a.G();
        c.G();
        b.G();
        Console.ReadKey();
    }
}

class Father
{
    public void F()
    {
        Console.WriteLine("A.F");
    }

    public virtual void G()
    {
        Console.WriteLine("A.G");
    } 
}
class Son : Father
{
    new public void F()
    {
        Console.WriteLine("B.F");
    }

    public override void G()
    {
        Console.WriteLine("B.G");
    }
}

a.F()调用的是父类自己的F()方法,而a.G()调用的却是子类的G()方法。
发表于 2019-03-12 15:27:06 回复(0)
H~7头像 H~7
当子类中已定义的方法用new修饰时,编译器根据声明的变量类型决定使用子类还是父类的方法;当用override修饰时,则是根据构造的对象实例类型来进行调用。
发表于 2022-03-05 14:51:39 回复(0)
https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/classes-and-structs/versioning-with-the-override-and-new-keywords
发表于 2022-01-11 07:35:26 回复(0)
<p><br></p><p>因为子类继承自父类,父类有的子类全部都继承下来了。所以如果子类对象赋值给父类对象,那么这个对象只能访问子类的父类里面的内容。但是子类对父类做了扩充,也就是说,子类中有父类中没有的部分。所以如果父类对象赋值给子类对象,那么系统就会报错。</p>
发表于 2021-08-31 10:49:55 回复(0)
普通方法与继承方法区别
发表于 2021-02-22 08:48:31 回复(0)
虚类是存在于基类跟子类之间。在C#里基类的成员在子类里是可用的,并且不会出现不希望的错误。在子类里要明确写出是继承的哪个类要重写的是哪个方法。 在C#里,子类可以使用跟父类一样的方法名。 1.基类的方法必须定义为虚类(virtual) 2.如果这个方法在子类里没有加上关键字new或者override,会警告warning而且会当做new关键字来处理 3.如果这个方法在子类里被new修饰,这个方法将被当做主类的独立的方法。 4.如果这个方法在子类里被override修饰,子类将把这个方法代替基类里的这个方法 5.override,virtual和new关键词也能被当做属性,索引和事件 我按自己理解翻译的这几条,觉得就足够说明这道题的问题了 原地址:https://msdn.microsoft.com/en-us/library/6fawty39.aspx 最后答案选B
发表于 2019-07-08 10:09:43 回复(0)
子类重写父类方法,父类原方法相当被删除
发表于 2018-12-11 21:56:16 回复(0)

这里有一个向上造型,a调用的都是b的方法。

发表于 2018-06-26 17:54:11 回复(0)
跟前面的有一道题是一样的,但是又因为用override重写方法,把子类的方法赋值给子类
发表于 2018-04-04 18:04:40 回复(0)
对象调用普通函数,是先从基类开始 对象调用虚函数时,从子类开始
发表于 2017-10-31 10:15:04 回复(0)
失误了,看清楚
发表于 2017-05-18 15:50:26 回复(0)
Father a = b; 这句话是什么意思
发表于 2016-04-26 21:12:30 回复(2)
B. 
A.F B.F B.G B.G
发表于 2015-09-25 00:28:52 回复(0)
D
发表于 2015-06-02 23:13:47 回复(0)