首页 > 试题广场 >

请问,o.MethodA调用的是?

[单选题]
using System;
namespace Application
{
abstract class BaseClass
{
    public virtual void MethodA()
    {
    }
    public virtual void MethodB()
    {
    }
}
class Class1: BaseClass
{
    public void MethodA(string arg)
    {
    }
    public override void MethodB()
    {
    }
}
class Class2: Class1
{
    new public void MethodB()
    {
    }
}
class MainClass
{
    public static void Main(string[] args)
    {
        Class2 o = new Class2();
        o.MethodA();
    }
}
}

请问, o.MethodA 调用的是?
  • BaseClass.MethodA
  • Class2.MethodA
  • Class1.MethodA
  • 都不是

抽象类如果在该抽象类中有方法没有实现(即也是抽象方法),那么该方法必须在子类实现!
发表于 2017-05-19 14:56:21 回复(0)
更多回答
若  publicvoidMethodA(string arg)中没参数则调用Class1,(不管使用new还是override,还是都没用)
这里有参数,则调用的是BaseClass.vs2013.亲测可通过编译.
发表于 2015-09-10 17:27:11 回复(3)
A
无论是class1还是class2都没有override/new MethodA(),所以调得是基类的virtual MethodA();
另外题目代码过不了编译2333
发表于 2015-01-04 11:54:11 回复(6)

图片说明
编译过了 确实 是 public virtual void MethodA()

virtual关键字用于指定属性搜索或方法在派生类中重写.
在基类(父类)中用virtual修饰符声明一个虚方法,然后在在派生类(子类)中用override修饰符覆盖基类虚方法。表明是对基类的虚方法重载。
这种优势在于它可以在程序运行时再决定调用哪一个方法,这就是所谓的“运行时多态”
或者称动态绑定。

编辑于 2017-08-03 13:46:14 回复(0)
之所以会调用BaseClass.MethodA()  是因为Class2里面没有这个成员函数,Class1里面也没有,Class1里面那个MethodA是个重载版本,参数不一样。
发表于 2018-02-12 14:27:10 回复(0)
Kie头像 Kie
。。。竟然一个有参数一个没参数
发表于 2017-10-29 14:35:36 回复(0)
我试了的,编译不通过,应该调用Class1的 public void MethodA(string arg) { } 函数,需要加参数,而题目后面没有加,应该选D
发表于 2015-09-06 18:47:23 回复(0)
太坏了,还有陷阱!
发表于 2019-05-11 10:28:27 回复(0)
class 2对象自然调用class2里的methodA方法,但是本身没有该方法,由于继承,去父类Class1中寻找,发现也没有,有的是函数重载,在去class1的父类寻找,也就是例子中的基类,找到了,所以是Baseclass.methodA
发表于 2018-07-04 19:49:17 回复(0)
这道题防不胜防,考的还是一个词:细心
发表于 2018-04-04 12:07:01 回复(0)
A,Class2 o=new Class2();没有参数,根据继承的传递性,用的是BaseClass中的
 
发表于 2016-08-23 09:40:52 回复(0)
重写和覆盖
发表于 2022-06-16 13:17:30 回复(0)
//1.如果把参数去掉,执行得到子类的方法A
//2.另外「public void MethodA」默认为「new public void MethodA」
//  还是得到子类的方法A,注意该方法没有重写父类的方法A
public void MethodA()
{
    System.Console.WriteLine($"Class1.MethodA");
}
虽然很简单,但是容易选错题,主要考察你对多态和继承

发表于 2022-02-09 13:48:57 回复(0)

我又瞎了?

发表于 2021-05-17 22:26:39 回复(0)
    abstract class BaseClass
    {
        public virtual void MethodA()
        {
            System.Console.WriteLine("BaseClass.MethodA");
        }

        public virtual void MethodB()
        {
            System.Console.WriteLine("BaseClass.MethodB");
        }
    }

    class Class1: BaseClass
    {
        // void MethodA() 继承BaseClass 

        // 下面的函数签名为
        // void MethodA(string)
        public void MethodA(string arg)
        {
            System.Console.WriteLine("Class1.MethodA");
        }

        public override void MethodB()
        {
            System.Console.WriteLine("Class1.MethodB");
        }
    }

    class Class2: Class1
    {
        // 继承Class.MethoA
        new public void MethodB()
        {
            System.Console.WriteLine("Class2.MethodB new");
        }
    }

    class InheritTest2
    {
        public static void Run()
        {
            Class2 o = new Class2();
            o.MethodA();
        }
    }

发表于 2021-03-28 15:21:55 回复(0)
没注意参数…
发表于 2020-10-21 16:48:26 回复(0)
试过了。如果说没有参数的话,他会调用基类baseclass中的A方法,如果说class1中的是无参的A方法,则会调用class1中的先,一层层网上找
发表于 2020-04-12 20:00:05 回复(0)
这是考能力还是考眼力
发表于 2020-03-22 17:02:41 回复(0)
class1,class2都没有override/new MethodA(),所以调得是基类的virtual MethodA();
发表于 2019-12-16 03:40:04 回复(0)
误人子弟,在VS2013下根本编译不过,应该选D
发表于 2019-11-17 16:15:41 回复(0)
编译可以通过,主要考虑参数的问题,最终搜索链会查到BaseClass里无参的A方法
发表于 2019-04-26 13:50:32 回复(0)