关于C#的多态问题

来源:百度知道 编辑:UC知道 时间:2024/06/21 01:52:07
namespace ConsoleApplication1
{
class Program
{
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();

}
}
}

class A
{
public virtual void F()
{
Console.WriteLine("A.F");
}

}
class B : A
{

new public override void F()
{
Console.WriteLine("B.F");
}
}
class C : B
{
public virtual void F()
{
Console.WriteLine("C.F");
}
}
class D : C
{
public override void F()
{
Console.WriteLine("D.F");
}
}
解释下输出结果为什么会是
B.F
B.F
D.F
D.F
最好能详细些

从后往前说吧
d.F()结果当然是D.F了
C中的F()方法已被D重写,所以c.F()的结果是D.F
B中的F()方法使用new关键字覆盖了A中的F()方法,所以b.F()和a.F()的结果都是B.F

注意 virtual、override、new的使用

在 C# 中,派生类可以包含与基类方法同名的方法。

基类方法必须定义为 virtual。

如果派生类中的方法前面没有 new 或 override 关键字,则编译器将发出警告,该方法将有如存在 new 关键字一样执行操作。

如果派生类中的方法前面带有 new 关键字,则该方法被定义为独立于基类中的方法。

如果派生类中的方法前面带有 override 关键字,则派生类的对象将调用该方法,而不是调用基类方法。