namespace TestInterview
{

public class A
{
public void printA()
{
Console.WriteLine("printA");
}
public virtual void valueA()
{
Console.WriteLine("valueA");
}
} public class B:A
{
    public  new  void printA()
{
Console.WriteLine("printB");
}
public override void valueA()
{
Console.WriteLine("valueB");

} class Class1
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main(string[] args)
{
//
// TODO: 在此处添加代码以启动应用程序
//
B BTemp= new B();
  A ATemp= new A();
ATemp = BTemp ;
ATemp.printA();
ATemp.valueA();
BTemp.printA();
BTemp.valueA();
Console.ReadLine(); }
}
}
------------------------------------------
结果:printA
      valueB
      printB
      valueB
为什么?为什么不是:printB
                    valueB
                    printB
                    valueB
请高手指点!谢谢。

解决方案 »

  1.   

    ATemp = BTemp ;赋值后,ATemp 到底指向了哪里?
      

  2.   

    printA没有virtual修饰,ATemp的类型是A,所以调用的是基类A的printA方法
      

  3.   

    ATemp = BTemp ;赋值后ATemp 指向BTemp  他内在数据还是BTemp类型的.具有多态.但因为printA方法使用了new操作符则这两个方法没什么关系,该方法不具有多态.显式调用Atemp还是会调用Atemp类的printA方法.这个地方比较绕,建议参考MSDN
      

  4.   

    如果B类里的,printA方法没有用NEW操作符,结果还是一样的,
      这又是为什么呢,
    zhy0101(香蕉) 能不能说具体一点呢。
      

  5.   

    studyingso many high hands
      

  6.   

    执行这句ATemp = BTemp;后
    ATemp.printA();调用的是A里的方法,因为B:A,且B没有相应的重载方法
    ATemp.valueA();调了B里的方法(重载A类的虚拟方法)
      

  7.   

    明白了,今天最后一天班,明天就可以放假了,
    感谢:copall(民工-〉席卷天下-包举宇内-囊括四海-并吞八荒!) ( )
    突然大悟,好了,马上结贴给分。