使用new关键字中断虚拟调用,并再次启动新的虚拟层次结构

本文关键字:虚拟 启动 层次结构 关键字 new 中断 调用 使用 | 更新日期: 2023-09-27 18:16:23

这是我弄混的代码。

 class foo
{
    public string fname;
    public virtual void print()
    {
        Console.WriteLine("I am the boss i am the virtual");
    }
};

class bar : foo 
{
    public override void print()
    {
        Console.WriteLine("I am the first derivative");   
    }
};

class tar : bar
{
    public new virtual void print()
    {
        Console.WriteLine("I am the newly born baby with a new keyword!!!!");
    }
};

class jar : tar
{
    public override void print()
    {
        Console.WriteLine("i am created in derivative of tar i.e, jar");
    }
};  
class Program
{
    static void Main(string[] args)
    {
        foo obj1 = new foo();
        obj1.fname = "neha";
        foo objtar = new jar();  //here lies the confusion why bar print() is called   
        objtar.print();
    }
}

在这个代码中,我使用第三级派生类(jar)对象和基(foo)调用打印方法。我看到输出很困惑,它是

我是一阶导数

有人能解释一下背后的原因吗?我是c#新手需要帮助....

使用new关键字中断虚拟调用,并再次启动新的虚拟层次结构

这是因为您在foo的实例上调用printnew关键字将只应用于该类型的类型化实例。

继承规则不再适用,因为tar.printnew

这是所有记录的行为,你可以在MSDN上找到。

所以这将工作如你所愿:

jar objtar = new jar();
objtar.print();