标签:
class CA { } class CB : CA{ } class CC : CB{ } } void Test(CA oa){//CATest Debug.Log ("CA==============="); } void Test(CB oa){//CBTest Debug.Log ("CB==============="); } void Test(CC oa){//CCTest Debug.Log ("CC==============="); } //测试代码如下: CC oc = new CC (); Test (oc);
在这种情形下调用Test(oc)有如下规律:<通过注释掉其它函数进行测试>
由此我们得知,Test(oc)调用时,编译器会由oc的继承层次由子到父的优先级去匹配重载函数的形参。这也符合正常逻辑。
class CA { } class CB : CA{ } class CC : CB{ /* MSDN类型转换的要求 1.操作数必须是封闭类型 2.类A到类B的类型转换定义不能在类C中进行(即2个类的转换不能在第3个类中定义, 如下面的参数定义)*/ public static implicit operator bool(CC ot/*不能是CA ot或 CB ot */){ Debug.Log ("bool================"); return ot != null; } } void Test(CA oa){//CATest Debug.Log ("CA==============="); } void Test(CB oa){//CBTest Debug.Log ("CB==============="); } void Test(CC oa){//CCTest Debug.Log ("CC==============="); }
void Test(bool b){//boolTest
Debug.Log ("b===============")
}
//测试代码如下: CC oc = new CC (); Test (oc);
此情形下boolTest重载函数和CATest, CBTest, CCTest的任何一个重载都冲突,原因如下:
当调用Test(oc)时,编译系统将oc与Test的四个重载函数的参数进行匹配,却发现四个都能匹配成功。Test(bool b)通过CC类的bool类型符重载而匹配。
CATest, CBTest, CCTest三个重载函数由于形参CC,CB,CA是继承关系,在进行匹配时是有优先级的,由于ot是CC类型的,所以优先级CC>CB>CA,因此这个三个重载函数间没有冲突,编译器明确知道该调用哪个重载。而bool重载与CC,CB,CA在类型转换时是同优先级,因此编译系统不知道该调用bool重载还是CC,CB,CA的三个重载了。
若将bool重载由类CC移到类CA中,其它代码不变,测试代码不变。经测试,boolTest,CATest, CBTest, CCTest四个重载可以共存,即boolTest与其它任何一个重载都不冲突。
这说明了基类的类型重载运算符的调用优先级低于父子层级转换的优先级,如情形5,在只有bool重载运算符时才会被调用。
本类的类型重载运算符的优先级等于父子层次转换的优先级。
标签:
原文地址:http://www.cnblogs.com/timeObjserver/p/5934259.html