下面的代码:
public class Program
{
static void Main(string[] args)
{
father f = new son(); Console.WriteLine(f.GetType());
f.show();
}
}
public class father
{
virtual public void show()
{
Console.WriteLine("father");
}
}
public class son : father
{
public override void show()
{
Console.WriteLine("son");
}
}
结果是“儿子”。
如果我将''修改为public override void show()
' public new void show()
',结果是'父亲'。
所以我总结以下“规则”:
- 使用“覆盖”,将在运行时确定调用哪个函数。程序会根据当前对象的真实类型选择合适的函数。(如上,f的运行时类型是son,所以调用了son的show。)
- 使用'new'修饰符,在编译时决定调用哪个函数。程序会选择对象的声明类型来调用它的函数。(如上,f的声明类型是father,所以使用'new'修饰符使输出以显示“父亲”。
以上就是我对多态的理解。有什么误解和错误吗?