C#中如果父类的虚拟方法被子类重写,那么调用父类方法的时候是不是直接执行的是子类重写的方法呢

同标题
2024年11月18日 13:46
有5个网友回答
网友(1):

这个要看你的引用了,如果你用子类创建的对象,那么自然是子类的方式。如果用你类的引用的,就是父类的方法。
比如:
class BaseClass {
public virtual void A(){}
}

class ExtendClass : BaseClass {
public overwrite void A(){}
}

这时如果是 ExtendClass a = new ExtendClass(); a.A(); //子类方法
如果是BaseClass a = new ExtendClass(); a.A(); //子类方法
如果是BaseClass a = new BaseClass(); a.A(); //父类方法

网友(2):

是的,是按你定义的那个变量的类型来执行

网友(3):

重写的含义是:子类不想再隐式继承父类同名方法,它想拥有自己的同名方法以输出不同的内容——并不会对父类原有方法造成改变


using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;


namespace ConsoleApplication1

{

    //父类

    public class FatherClass

    {

        public virtual void F()

        {

            Console.WriteLine("父类方法");

        }

    }

    //子类1 重写父类方法

    public class ChildClass1:FatherClass

    {

        public override void F()

        {

            Console.WriteLine("子类1方法");

        }

    }

    //子类2 在子类1重写了父类方法后,再次调用父类方法,看父类方法是否发生了改变,即是否变成了子类1重写的方法

    public class ChildClass2: FatherClass

    {

      

    }



    //主函数类

    class Program

    {

        static void Main(string[] args)

        {

            ChildClass1 cc1 = new ChildClass1();

            cc1.F();//输出结果是“子类1方法”


           


            ChildClass2 cc2 = new ChildClass2();

            cc2.F();//输出结果仍然是是“父类方法”



            Console.ReadKey();

        }

    }

}

网友(4):

class Program
{
public Program()
{
Console.WriteLine("父类构造方法");
}

public virtual void show()
{
Console.WriteLine("父类同名方法");
}
}

class sonProgram : Program
{
public sonProgram()
{
Console.WriteLine("子类构造方法");
}

public override void show()
{
Console.WriteLine("子类同名方法");
}
}

public class demo
{
public static void Main(string[] args)
{
Program pr = new sonProgram();
pr.show(); //父类构造方法 子类构造方法 子类同名方法

Program p = new Program();
pr.show(); //父类构造方法 子类同名方法
}
}

要养成这个习惯遇到什么疑问就去用程序来证明,你说的这个是 直接执行子类的方法,父类方法被覆盖了

网友(5):

是的啊 嗯