为什么 子类的实例向父类转型之后,再调用父类中定义并在子类中被override过的方法,实际执行的是子类的方法?
我知道这种现象的存在,但是怎么解释这种现象?
class A
{
public virtual void fun1()
{
Console.WriteLine("1、A --> public void fun1()");
}
public void fun2()
{
this.fun1();
}
};
class B : A
{
// 覆写了fun1()方法
public override void fun1()
{
Console.WriteLine("2、B --> public void fun1()");
}
// 增加了一个fun3()方法
public void fun3()
{
Console.WriteLine("3、B --> public void fun3()");
}
};
public class OODemo01
{
public static void Main(String[] args)
{
A a = null;
a = new B();
// 子类对象为父类实例化
// fun1方法被子类覆写了
// B b = null ;
// b = (B)a ;
a.fun2(); B b = new B();
(b as A).fun1();
b.fun2(); // b.fun2() ;
Console.Read();
}
};
我知道这种现象的存在,但是怎么解释这种现象?
class A
{
public virtual void fun1()
{
Console.WriteLine("1、A --> public void fun1()");
}
public void fun2()
{
this.fun1();
}
};
class B : A
{
// 覆写了fun1()方法
public override void fun1()
{
Console.WriteLine("2、B --> public void fun1()");
}
// 增加了一个fun3()方法
public void fun3()
{
Console.WriteLine("3、B --> public void fun3()");
}
};
public class OODemo01
{
public static void Main(String[] args)
{
A a = null;
a = new B();
// 子类对象为父类实例化
// fun1方法被子类覆写了
// B b = null ;
// b = (B)a ;
a.fun2(); B b = new B();
(b as A).fun1();
b.fun2(); // b.fun2() ;
Console.Read();
}
};
解决方案 »
- 【在线等】【求解决】海康威视SDK二次开发 手动解码时预览视频时会出现绿色(全屏绿色)
- Stimulsoft Reports 报表问题
- 简单问题。。。真的很简单。。。
- C# WEB开发 ,如何连接 mysql 数据库?
- Socket SQL 多线程服务器端, 远程桌面时造成主线程卡死
- vb6可以做ACTIVEX控件,并且放入网页,在客户显示出来,C#可以做这样的控件吗?具体方法和步骤是什么样的?
- 用正则表达式判断手机号是否合理应该怎么写(手机号共有11位,第一位是1,第二位是3),谢谢,在线等
- 关于DATAGRID
- 这个是用什么技术实现的?
- 大拿帮我看看这个正则表达式含义,在线等
- 为什么 子类的实例向父类转型之后,调用的方法是子类的版本,而访问的子类中和父类中都存在的同名公有字段是父类的版本?
- listview 显示数据库问题
而你也继承了你爸爸会打篮球,但你扣篮,三分球都会(override)
那你去打篮球的时候是只会三分球还是扣篮,三分球都用呢?
呵呵,可能不恰当!
我给你解释这一句代码:
B b = new B();
(b as A).fun1();
为什么他调用的是类型B中的方法,而不调用类型A中的方法呢?
原因是你虽然把b强制转换为类型A,但是你别忘了,这个b只是作为A类型使用,但其实他的引用是B类型的。
因为你new的是B类型,他是B类型的一个实例。所以虽然你把它作为A类型来使用,但实际上他还是会调用自身类型中定义的方法。