重写父类虚方法的子类的方法改喊虚方法吗?(探讨)
重写父类虚方法的子类的方法改叫虚方法吗?(探讨)
在clr via c#中有如下话:
“如前所述,调用虚方法的性能不如调用非虚方法的性能,这是因为CLR为了确定所调用方法的类型必须在运行时查找对象的类型。但是,如果JIT编译器通过使用密封类型将调用看成虚方法,那么JIT编译器通过非虚拟地调用方法就可以产生效率更好的代码。JIT编译器这么做是因为JIT编译器知道如果类是密封的,那么这个类就不可能是派生类。
例如,在下面的代码中,JIT编译器可以非虚拟地调用虚方法ToString:
using System;
public sealed class Point {
private Int32 m_x, m_y;
public Point(Int32 x, Int32 y) { m_x = x; m_y = y; }
public override String ToString() {
return String.Format("({0}, {1})", m_x, m_y);
}
public static void Main() {
Point p = new Point(3, 4);
//C#编译器在此生成callvirt指令,但是JIT编译器将优化这个调用,并生成非虚拟调
//用ToString方法的代码,这是因为p的类型是Point,而Point是一个密封类
Console.WriteLine(p.ToString());
}
}
我的疑问就是,红色字体部分,以Point类对象为中心来说ToString为虚方法是不是欠妥,对于Point对象来说,ToString应该只是一个普通的实例对象,但是以Point的父对象Object为中心来说,ToString为虚方法很正确
我不清楚红色字体部分的说法 到底对不对,请大家帮我看下
------解决方案--------------------
ToString()是虚方法,假设Point类不是sealed的,那么其派生类也能够重写这个方法。
虚方法是具体方法的客观属性,不随看问题的视点而改变。
------解决方案--------------------
LS+1
受教了.....也就是说tostring()本身就是个虚方法..没有对哪个类的说法..
这样一说.其实方法本身是没有分在类里的..而应该说类型是方法的一个参数..只不过我们这写可读性好.实际上编译器帮我们把类作为参数给了方法而已..
在clr via c#中有如下话:
“如前所述,调用虚方法的性能不如调用非虚方法的性能,这是因为CLR为了确定所调用方法的类型必须在运行时查找对象的类型。但是,如果JIT编译器通过使用密封类型将调用看成虚方法,那么JIT编译器通过非虚拟地调用方法就可以产生效率更好的代码。JIT编译器这么做是因为JIT编译器知道如果类是密封的,那么这个类就不可能是派生类。
例如,在下面的代码中,JIT编译器可以非虚拟地调用虚方法ToString:
using System;
public sealed class Point {
private Int32 m_x, m_y;
public Point(Int32 x, Int32 y) { m_x = x; m_y = y; }
public override String ToString() {
return String.Format("({0}, {1})", m_x, m_y);
}
public static void Main() {
Point p = new Point(3, 4);
//C#编译器在此生成callvirt指令,但是JIT编译器将优化这个调用,并生成非虚拟调
//用ToString方法的代码,这是因为p的类型是Point,而Point是一个密封类
Console.WriteLine(p.ToString());
}
}
我的疑问就是,红色字体部分,以Point类对象为中心来说ToString为虚方法是不是欠妥,对于Point对象来说,ToString应该只是一个普通的实例对象,但是以Point的父对象Object为中心来说,ToString为虚方法很正确
我不清楚红色字体部分的说法 到底对不对,请大家帮我看下
------解决方案--------------------
ToString()是虚方法,假设Point类不是sealed的,那么其派生类也能够重写这个方法。
虚方法是具体方法的客观属性,不随看问题的视点而改变。
------解决方案--------------------
LS+1
受教了.....也就是说tostring()本身就是个虚方法..没有对哪个类的说法..
这样一说.其实方法本身是没有分在类里的..而应该说类型是方法的一个参数..只不过我们这写可读性好.实际上编译器帮我们把类作为参数给了方法而已..