22

当我尝试运行以下代码片段时,它正在执行错误的重载方法。我很困惑为什么会这样? [testB.TestMethod(testValue)方法执行 public double TestMethod(double value)方法]

public class TestA
{
    public int TestMethod(int value)
    {
        return value;
    }
}

public class TestB : TestA
{
    public double TestMethod(double value)
    {
        return value;
    }
}

static void Main( string[] args )
{
    TestB testB = new TestB();

    int testValue = 3;

    testB.TestMethod(testValue);
}

你对此有什么想法吗?

有什么方法可以通过 TestB 实例调用 TestA 类方法而不强制转换为 TestA。?

但它不会发生在 JAVA 和 C++ 中

4

2 回答 2

22

从规范中,在“过载解决方案”下:

...如果派生类中的任何方法适用(第 7.6.5.1 节),则基类中的方法不是候选对象。

于 2013-10-01T09:35:21.537 回答
9

遗产

继承会导致混乱的效果。当编译器查找实例方法重载时,它会考虑调用“目标”的编译时类,并查看那里声明的方法。如果找不到合适的东西,它就会查看父类……然后是祖父类等。这意味着如果层次结构的不同级别有两个方法,将首先选择“更深”的一个,即使它不是调用的“更好的函数成员”。

来源:http ://cshapindepth.com/Articles/General/Overloading.aspx

于 2013-10-01T09:34:16.233 回答