几道这样的题,分别输出什么结果?并且说明理由,为什么会是这样的结果,全面深入的剖析
1. public class A
{
public void F()
{
Console.WriteLine("A.F");
Console.ReadLine();
}
public virtual void G()
{
Console.WriteLine("A.G");
Console.ReadLine();
}
}
public class B : A
{
new public void F()
{
Console.WriteLine("B.F");
Console.ReadLine();
}
public override void G()
{
Console.WriteLine("B.G");
Console.ReadLine();
}
}
static void Main(string[] args)
{
B b = new B();
A a = b;
a.F();
b.F();
a.G();
b.G();
}
第二题: public class A
{
public virtual void F()
{
Console.WriteLine("A.F");
Console.ReadLine();
}
}
public class B : A
{
public override void F()
{
Console.WriteLine("B.F");
Console.ReadLine();
}
}
public class C : B
{
new public virtual void F()
{
Console.WriteLine("C.F");
Console.ReadLine();
}
} public class D : C
{
public override void F()
{
Console.WriteLine("D.F");
Console.ReadLine();
}
}static void Main(string[] args)
{
D d = new D();
A a = d;
B b = d;
C c = d;
a.F();
b.F();
c.F();
d.F();
}
还有一些更复杂的,涉及到接口的了,把一个对象强转为接口类行等等,郁闷了
1. public class A
{
public void F()
{
Console.WriteLine("A.F");
Console.ReadLine();
}
public virtual void G()
{
Console.WriteLine("A.G");
Console.ReadLine();
}
}
public class B : A
{
new public void F()
{
Console.WriteLine("B.F");
Console.ReadLine();
}
public override void G()
{
Console.WriteLine("B.G");
Console.ReadLine();
}
}
static void Main(string[] args)
{
B b = new B();
A a = b;
a.F();
b.F();
a.G();
b.G();
}
第二题: public class A
{
public virtual void F()
{
Console.WriteLine("A.F");
Console.ReadLine();
}
}
public class B : A
{
public override void F()
{
Console.WriteLine("B.F");
Console.ReadLine();
}
}
public class C : B
{
new public virtual void F()
{
Console.WriteLine("C.F");
Console.ReadLine();
}
} public class D : C
{
public override void F()
{
Console.WriteLine("D.F");
Console.ReadLine();
}
}static void Main(string[] args)
{
D d = new D();
A a = d;
B b = d;
C c = d;
a.F();
b.F();
c.F();
d.F();
}
还有一些更复杂的,涉及到接口的了,把一个对象强转为接口类行等等,郁闷了
static void Main(string[] args)
{
B b = new B();
A a = b;
a.F();
b.F();
a.G();
b.G();
}
这么跟你说吧,一切都以new 为中心。
A a=b,的啊,这个只是b被加了一层皮而已
new 是表示实例化一个对象,而且内存会分配内存给对象
其他的东西都是引用该内存对象
2.子类继承重写之后,如果没用调用base.XXX()就完全按重写后内容
3.子类重写并且调用了base.XXX()就会在相应地方掉父类方法