C#中的虚函数

Rag*_*v55 4 c# inheritance virtual-functions

public class Base1
{
    public virtual void f()
    {
        Console.WriteLine("Base1.f()");
    }
}

public class Derived1 : Base1
{
    // Hides Base1.f() because 'override' was not specified
    public new virtual void f()
    {
        Console.WriteLine("Derived1.f()");
    }
}

public class Derived2 : Derived1
{
    // Overrides Derived1.f()
    public override void f()
    {
        Console.WriteLine("Derived2.f()");

        // Call base method
        base.f();
    }
}

class Program
{
    static void Main(string[] args)
        Base1 ob1 = new Derived1();
        ob1.f();

        Base1 ob2 = new Derived2();
        ob2.f();

        Derived1 ob3 = new Derived2();
        ob3.f();

        Derived2 ob4 = new Derived2();
        ob4.f();
    }
}


// Calls Derived2.f() because Derived2 overrides Derived1().f()
        Derived1 ob3 = new Derived2();
        ob3.f();
Run Code Online (Sandbox Code Playgroud)

它期待着

Base1 ob2 = new Derived2();
ob2.f();
Run Code Online (Sandbox Code Playgroud)
  1. 将调用derived2函数,但调用基类函数,原因是什么.
  2. .net是否使用vtables

Mar*_*ell 6

编译期间静态分析使用的方法槽取决于变量(或表达式)的类型,而不是实际对象.变量ob2的类型为Base1,因此使用Base1方法槽.和然后正确的倍率是基于所述类型化的(在该槽基本上虚函数表)来选择.所以使用了基本功能.

要使用derived2函数,必须将变量(或表达式)键入为Derived1子类.