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

时间:2014-08-05 13:28:51

标签: c# inheritance polymorphism virtual method-overriding

这是我困惑的代码。

 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();
    }
}

在这段代码中,我使用3级派生类(jar)对象和base(foo)调用print方法。通过查看输出

我很困惑
  

我是第一个派生词

有人可以解释其背后的原因。我是c#需要帮助的新手......

1 个答案:

答案 0 :(得分:0)

这是因为您在print的实例上调用了foonew关键字仅适用于该类型的类型化实例。

由于tar.printnew,继承规则不再适用。

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

所以这将按预期工作:

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