I tried the following piece of code
<code>public abstract class Entry3
{
public abstract void Method1();
public virtual void Method2() { Console.WriteLine("Entry3.Method2"); }
}
public abstract class Entry31 : Entry3
{
public override void Method1()
{
Console.WriteLine("Entry31.Method1");
}
public virtual void Method2() { Console.WriteLine("Entry31.Method2"); }
}
public class Entry32 : Entry31
{
public override void Method1()
{
Console.WriteLine("hi");
}
public override void Method2() { Console.WriteLine("Entry32.Method2"); }
}
public class Main4
{
public static void Main()
{
Entry32 e32 = new Entry32();
e32.Method1();
//((Entry31)e32).Method1();
((Entry3)e32).Method1();
e32.Method2();
((Entry31)e32).Method2();
((Entry3)e32).Method2();
Console.ReadKey();
}
}
</code>
<code>public abstract class Entry3
{
public abstract void Method1();
public virtual void Method2() { Console.WriteLine("Entry3.Method2"); }
}
public abstract class Entry31 : Entry3
{
public override void Method1()
{
Console.WriteLine("Entry31.Method1");
}
public virtual void Method2() { Console.WriteLine("Entry31.Method2"); }
}
public class Entry32 : Entry31
{
public override void Method1()
{
Console.WriteLine("hi");
}
public override void Method2() { Console.WriteLine("Entry32.Method2"); }
}
public class Main4
{
public static void Main()
{
Entry32 e32 = new Entry32();
e32.Method1();
//((Entry31)e32).Method1();
((Entry3)e32).Method1();
e32.Method2();
((Entry31)e32).Method2();
((Entry3)e32).Method2();
Console.ReadKey();
}
}
</code>
public abstract class Entry3
{
public abstract void Method1();
public virtual void Method2() { Console.WriteLine("Entry3.Method2"); }
}
public abstract class Entry31 : Entry3
{
public override void Method1()
{
Console.WriteLine("Entry31.Method1");
}
public virtual void Method2() { Console.WriteLine("Entry31.Method2"); }
}
public class Entry32 : Entry31
{
public override void Method1()
{
Console.WriteLine("hi");
}
public override void Method2() { Console.WriteLine("Entry32.Method2"); }
}
public class Main4
{
public static void Main()
{
Entry32 e32 = new Entry32();
e32.Method1();
//((Entry31)e32).Method1();
((Entry3)e32).Method1();
e32.Method2();
((Entry31)e32).Method2();
((Entry3)e32).Method2();
Console.ReadKey();
}
}
The response was “Entry3.Method2” for the last line ((Entry3)e32).Method2();
. I have overridden the base Entry31
Method2 in Entry32. Is C# finding that the Entry3
Method2 not being overridden in Entry32 and calling Entry3.Method2. Can anyone help me understand this behavior
3
Entry32::Method2
overrides Entry31::Method2
, not Entry3::Method2
. Since the override chain is broken between Entry3
and Entry31
(it is a shadow – completely different functions as far as the runtime is concerned) the virtual dispatch doesn’t pass there.
1