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()。