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

C# 使用new关键字中断虚拟调用并再次启动新的虚拟层次结构,c#,inheritance,polymorphism,virtual,overriding,C#,Inheritance,Polymorphism,Virtual,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 t

这是我弄糊涂的代码

 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)调用print方法。我对它的输出感到困惑

我是一阶导数


有人能解释一下背后的原因吗。我是c的新手,需要帮助……

这是因为您在
foo
的实例上调用
print
new
关键字将仅应用于该类型的类型化实例

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

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

因此,这将按照您的预期工作:

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

您使用了
new
关键字而不是override。使用
new
会打破继承链。new是一个棘手的问题。尝试打印((jar)objtar)。但是我被jar的print()调用所震惊,为什么这里不调用foo print()呢?我知道,但是为什么要调用第一个设计类方法呢?为什么不调用基类print()。原始继承链不受
new
的影响,只需启动一个新链即可。如果用
new
声明一个虚拟方法对基类有任何影响,
bar
类的编写者将不得不在假设每个
覆盖
可能会或可能不会实际覆盖的情况下设计他的类,即继承将是一个雷区。这仅仅是因为您有
覆盖
n它。在
覆盖
新建
方面存在重大差异
override
遵循继承。@Cygon+1用简单的术语解释实际原因。thanks@PatrickHofman不,patrick,我知道我一直在寻找的一点是,一旦一个新的虚拟方法添加到虚拟调用链中,虚拟调用链就会被打破,这就是为什么会调用bar print()。