using System;
namespace Apple
{
class A
{
public virtual void Func(int a=4){
Console.WriteLine(" A Class: "+a);
}
}
class B : A
{
public override void Func(int a = 12)
{
Console.WriteLine(" B Class: "+ a);
}
}
public class Program
{
static void Main(string[] args)
{
A ob = new B();
ob.Func();
Console.ReadLine();
}
}
}
// Output: B Class: 4
答案 0 :(得分:2)
默认参数在编译时填充,代码通过基类引用变量ob
。正如预期的那样,虚方法覆盖在运行时工作。您可以使用方法 overload :
class A
{
public void Func(int value)
{
}
public virtual void Func()
{
Func(4);
}
}
class B: A
{
public override void Func()
{
Func(12);
}
}
答案 1 :(得分:1)
编译器根据对象 的类型放置默认参数值,并在编译期间完成。
因此编译的代码看起来像:
using System;
namespace Apple
{
public class Program
{
private static void Main(string[] args)
{
A ob = new B();
ob.Func(4);
Console.ReadLine();
}
}
}
这样做可以得到理想的结果:
public class Program
{
static void Main(string[] args)
{
A ob = new B();
((B)ob).Func();
Console.ReadLine();
}
}
答案 2 :(得分:0)
因为你创建了A类的实例,它引用了B类的地址。
A ob = new B();
由于实例是A类,因此您调用的方法指向A类中的方法。 您可以通过调试然后执行代码来检查这一点。
相反,如果你创建了B类的实例,即
B ob = new B();
它将从类B调用方法Fun()并将输出显示为 “B级:12”
答案 3 :(得分:0)
默认参数值为静态绑定。