黑马程序员技术交流社区
标题:
虚方法
[打印本页]
作者:
罗代势
时间:
2012-12-19 20:13
标题:
虚方法
本帖最后由 罗代势 于 2012-12-21 21:55 编辑
public void method()
{
Console.WriteLine("class3.method()");
}
public virtual void methodVirtual() //虚方法
{
Console.WriteLine("class3.methodVirtual()");
}
}
class class4 : class3
{
new public void method()
{
Console.WriteLine("class4.method()");
}
public override void methodVirtual() //重写方法
{
Console.WriteLine("class4.methodVirtual()");
}
class Program
{
static void Main(string[] args)
{
class3 cla1 = new class3();
class4 cla2 = new class4();
class3 cla3 = cla2; //设置对象cla3编译时的类型为class3,运行时的类型为class4
Console.WriteLine("非虚方法");
cla1.method();
cla2.method();
cla3.method(); //这是的结果为什么是class3.method() ??
Console.WriteLine("虚方法");
cla1.methodVirtual();
cla2.methodVirtual();
cla3.methodVirtual(); //这里的结果为什么是class4.methodVirtual()??
}
}
作者:
高境
时间:
2012-12-19 20:22
这个是C#程序吧?我学过一点。
作者:
许庭洲
时间:
2012-12-19 20:30
虚方法,它的执行方式可以被派生类改变,这种改变是通过方法的重载来实现的;
using System;
class A
{
public void F(){ Console.WriteLine("A.F");}
public virtual void G(){ Console.WriteLine("A.G");}
}
class B:A
{
new public void F(){ Console.WriteLIne("B.F");}
public override void G(){ Console.WriteLine("B.G");}
}
class Test
{
static void Main(){
B b= new B();
A a=b;
a.F();
b.F();
a.G();
b.G();
}
}
例子中,A类提供了两个方法:非虚的F和虚方法G. 类B则提供了一个新的非虚的方法F,从而覆盖了继承的F;
类B同时还重载了继承的方法G. 那么输出因该为:
A.F
B.F
B.G
B.G
提示:方法a.G()实际调用了B.G,而不是A.G. 这是因为编译时值为A,但运行时值为B,所以B完成了对方法的实际调用。
作者:
Sailing.
时间:
2012-12-19 20:31
本帖最后由 Sailing. 于 2012-12-19 20:32 编辑
正如你所见,你在class4中定义的method()方法为什么要添加new关键字,其实不添加也能编译,我想在很多书籍中也有这样的实例,这叫方法的隐藏。然后引出了你的第二个疑问为什么是class4 的methodVirtual(),而不是class3的methodVirtual()的方法。这其实是一个很好的实例!如果楼主要打破沙地问到底的话,这要探究到CLR对实例方法和虚方法的的处理关系。
作者:
罗代势
时间:
2012-12-20 17:48
谢谢大家的回答
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2