name Test
{
class a
{
virtual string Hello()
{
return "hello" ;
}
}class b : a
{
override string Hello()
{
return "hello2000" ;
}
}
static void Main(string[] args)
{
a myClass = new b() ;
Console.Write( myClass.Hello() ) ;
}
}
运行结果会怎样!!!
不要测试,自己先猜一下............................
{
class a
{
virtual string Hello()
{
return "hello" ;
}
}class b : a
{
override string Hello()
{
return "hello2000" ;
}
}
static void Main(string[] args)
{
a myClass = new b() ;
Console.Write( myClass.Hello() ) ;
}
}
运行结果会怎样!!!
不要测试,自己先猜一下............................
我自己猜的找人来说说理由~~
隐式转换,不会改变内容
a myClass = new b() ;
Console.Write( myClass.Hello() ) ;
就相当于
b myClass = new b() ;
Console.Write( (a)myClass.Hello() ) ;
myClass 是B的一个实例,
a myClass = new b() ;
Console.Write( myClass.Hello() ) ;
就相当于
b myClass = new b() ;
Console.Write( ((a)myClass).Hello() ) ;
楼上的~~其实这是一个笔试的C#.net题目其中还有一个选项我没有说,
那就是”不确定“具体输出是什么,是不确定~~
a myClass = new b() ;
class b : a
{
override string Hello()
{
return "hello2000" ;
}
}
Console.Write( myClass.Hello() ) ;----------------------------------
执行结果:hello2000看来,NEW决定myClass是b的实例,楼主答案不正确
就像在.net中所有类都是Object类的子类。即使你装箱后仍然保存着原来类的数据结构。
和这个题一样。因为在用new生成一个实例时,是b得实例。这个类的相关属性等就已经确定了。
像这个例子中的隐式转换就相当于一个装箱的操作。
下面是那个例子的IL代码:
.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
// Code Size: 18 byte(s)
.maxstack 1
.locals (
Test.b b1)
L_0000: newobj instance void Test.b::.ctor() 创建b的实例
L_0005: stloc.0
L_0006: ldloc.0
L_0007: callvirt instance string Test.a::Hello() 这里可以看到调用的是a的Hello()
L_000c: call void [mscorlib]System.Console::Write(string)
L_0011: ret
}
这个市使用Reflector for .NET 反编译出来的
问题,不知道楼上的怎么会涉及到装箱?装箱是将值类型转换成引用类型时才会发生的操作。楼主有不是hello2000的情况吗?
其实这个写法和
object maClass=new b();
是一个效果的,道理也相似。
刚才写new b()一下想到-牛X,YY了。
覆盖了,根本没执行a.Hello()
不相当于问System.Drawing.Brush brush=SystemBrushes.Control;brush 是什么类型?