![]() |
#2
yhlvht2016-05-19 20:18
|

using System;
namespace foreachtest
{
class program
{
public static void Main(string[] args)
{
A a=new A();
B b=new B();
A ab=new B();
C c=new C();
// a.afuc();
// a.avfuc();
// b.afuc();
// b.avfuc();
// ab.afuc();
// ab.avfuc();
// c.afuc();
c.avfuc();
}
}
class A
{
public void afuc()
{
Console.WriteLine("这是A的普通方法");
}
public virtual void avfuc()
{
Console.WriteLine("这是A的虚方法");
}
}
class B:A
{
public new void afuc()
{
Console.WriteLine("这是B的普通方法");
}
public override void avfuc()
{
// base.avfuc();
Console.WriteLine("这是B的虚方法");
}
}
class C:B
{
public override void avfuc()
{
((A)this).avfuc();//这里的问题
Console.WriteLine("这是C的虚方法");
}
public new void afuc()
{
((A)this).afuc();
Console.WriteLine("这是c的普通方法");
}
}
}
namespace foreachtest
{
class program
{
public static void Main(string[] args)
{
A a=new A();
B b=new B();
A ab=new B();
C c=new C();
// a.afuc();
// a.avfuc();
// b.afuc();
// b.avfuc();
// ab.afuc();
// ab.avfuc();
// c.afuc();
c.avfuc();
}
}
class A
{
public void afuc()
{
Console.WriteLine("这是A的普通方法");
}
public virtual void avfuc()
{
Console.WriteLine("这是A的虚方法");
}
}
class B:A
{
public new void afuc()
{
Console.WriteLine("这是B的普通方法");
}
public override void avfuc()
{
// base.avfuc();
Console.WriteLine("这是B的虚方法");
}
}
class C:B
{
public override void avfuc()
{
((A)this).avfuc();//这里的问题
Console.WriteLine("这是C的虚方法");
}
public new void afuc()
{
((A)this).afuc();
Console.WriteLine("这是c的普通方法");
}
}
}
这个程序编译通过了,但运行出错Process is terminated due to StackOverflowException.
我知道它有错,但是不是很了解原因
((A)this).avfuc()编译通过,说明了编译器的确将当前对象强制转换成了A类对象,但为什么运行时异常,是因为仍然使用的是c对象?类似多态?那new里面为什么是可以通过的?
望大神解释解释