假设我有一个类:操作符重载问题
public class Vector
{
public float X { get; set; }
public Vector(float xvalue)
{
X = xvalue;
}
public static Vector operator +(Vector v1, Vector v2)
{
return new Vector(v1.X + v2.X);
}
}
有一个派生类:
public class MyVector : Vector
{
public static MyVector operator +(MyVector v1, MyVector v2)
{
return new MyVector(v1.X + v2.X);
}
public MyVector(float xvalue):base(xvalue)
{
}
}
没有,如果我执行如下因素代码:
Vector v1 = new MyVector(10); //type MyVector
Vector v2 = new MyVector(20); //type MyVector
Vector v3 = v1 + v2; //executed operator is of Vector class
这里执行Vector的+运算符,但v1和v2的类型为MyVector
,因此v3在此处为Vector类型。
为什么会发生这种情况?
你所期望的是,运算符重载分辨率使用*双虚拟分派*,但实际上它使用*非虚拟分派*。如果运营商是通过双重虚拟调度解决的,但这种语言不支持该功能,那将是非常棒的。请参阅http://blogs.msdn.com/b/ericlippert/archive/2009/04/09/double-your-dispatch-double-your-fun.aspx了解更多关于此的想法。 –
明白了,通过查看代码执行的问题我会说,v3是MyVector或可能是其他派生类型,但不是基于一个。真棒...而是在这里统治只是“简单”的静态函数规则的规则。 – Tigran