注册 登录
编程论坛 C# 论坛

关于上转型

未来大仙 发布于 2017-04-21 00:49, 2352 次点击
public class A
{
   public virtual void G()
       {  Console.WriteLine("A.G"); }
   public F()
       {  Console.WriteLine{"A.F"}; }
}
public class B : A
{
     public override void G()
       {  Console.WriteLine("B.G"); }
     new void F()
       {  Console.WriteLine("B.F");  }

}
public class pro
{
    public static void Main()
       {
             B b = new B();
             A a = b;
             A.G();
             B.G();
             A.F();
             B.F();
       }
}
初学C# 就想问这个上转型是怎么回事,网上有人说,是子类转换成了父类,但是实例指向还是指向子类,所以在输出重写方法的时候,输出的是子类的方法,既然是指向子类的,为什么在调用非虚方法的时候,是调用的父类的隐藏方法???

请回答的详细回答问题描述的每个细节,谢谢!!!!!!
3 回复
#2
未来大仙2017-04-21 00:50
真的在线等10分钟,10分钟后没人回,明天再来看大家的解释
#3
未来大仙2017-04-21 01:01
。。。。。。。我觉得,这个对于老手来说是个很容易的一个问题,我希望明天能有一个热心肠的不嫌麻烦的大佬帮我解答一下这个问题,谢谢了
#4
yhlvht2017-04-21 20:51
B b = new B();  //这里实例化了一个类B,赋给了B类型的变量b,这句应该没有什么异议
A a = b;    //这句是将b赋给A类型的变量a, 先说为什么可以这样做,因为B继承A,A是B的基类或叫父类。B包含了父类A的所有内容(当然私有的除外),把B转换为A完全可以,这样的转换是安全的,完全可以把b当成是a来用,在面向接口编程的时候经常会这样做。但是如果B b = a; 这样是不行的,因为b里面含有a里面不存在的东西,a无法转换为B类型,无法把一个A的类型,当成是B类型来使用。
A.G();//看起来这句没有什么疑问,因为b重写的a的方法,a也实际指向了B类,所以输出B类的方法
B.G();//这句也没有什么疑问
A.F();//虽然a实际指向的是B的实例,但是已经把b当成了a来使用,因为是调用的A类型的方法。这里首先就会按调用类型检查A类的F方法,该方法并非虚方法,所以会输出A类的方法。如果方法是虚方法,才会检查实际指向的是不是B类的实例,如果是B的实例,再检查B类有没有重写该方法,如果有重写,就调用B类的;如果没有重写,还是调用A类的(即使A类的方法是virtual虚方法,如果子类没有使用override重写,而是使用的new,那么依然调用A类的方法)
B.F();//这句应该也没有什么问题的
1