首页 > 解决方案 > 有继承问题的重载

问题描述

我有以下代码,它运行成功。但仔细注意它的输出:

using System;                    
class Base 
{ 
    public int f(int i) 
    { 
        Console.Write("f (int): "); 
        return i + 3; 
    } 
} 
class Derived : Base 
{ 
    public double f(double i) 
    { 
        Console.Write("f (double) : "); 
        return i+3.3; 
    } 
} 
class MyProgram 
{ 
    static void Main(string[] args) 
    { 
        Derived obj = new Derived(); 
        Console.WriteLine(obj.f(3)); 
        Console.WriteLine(obj.f(3.3)); 
        Console.ReadKey(); // write this line if you use visual studio 
    } 
} 
输出:

f(双):6.3
f(双):6.6


预期输出:

f(整数):6
f(双):6.6

这里它只调用派生类方法。但是,如果我稍微改变一下这个程序,如下所示,那么输出是意外的。然后我尝试了一些东西,我认为这是类型的优先顺序。当我将 Base 类从 int 交换为 double 并将 Derived 类从 double 交换为 int 时,预期的输出为真。

using System;
namespace MyProgram
{
    class Base
    {
        public double f(double i)
        {
            Console.Write("f (double): ");
            return i + 3.3;
        }
    }
    class Derived : Base
    {
        public int f(int i)
        {
            Console.Write("f (int): ");
            return i + 3;
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Derived obj = new Derived();
            Console.WriteLine(obj.f(3));
            Console.WriteLine(obj.f(3.3));
        }
    }
}
输出:

f(整数):6
f(双):6.6

怎么可能?

标签: c#

解决方案


在第一个示例中,编译器可以在数字类型(intto double)之间进行简单的类型转换。这使得该f(double)函数成为可能的调用目标。编译器会尽可能在派生类上调用函数,因为派生类可能包含更具体的逻辑。基类可能包含更多通用逻辑,因此价值较低。

在第二个示例中,派生类上的函数只能使用int参数调用。编译器选择这个函数是因为它在派生类上,即使基类上的函数也可能有效。当参数为 a 时,基类上的函数是唯一的选项double


推荐阅读