using System;namespace TestWinForm
{
/// <summary>
/// MainClass 的摘要说明。
/// </summary>
public class MainClass
{

public class A
{
public  void printA()
{
System.Diagnostics.Debug.WriteLine("printA");
} public virtual void valueA()
{
System.Diagnostics.Debug.WriteLine("ValueA");
}
} public class B:A
{
new public void printA()
{
System.Diagnostics.Debug.WriteLine("printB");
} public override void valueA()
{
System.Diagnostics.Debug.WriteLine("ValueB()");
} } private static void Main()
{
B BTemp=new B(); 
A ATemp=BTemp; 
ATemp.printA(); //printA
ATemp.valueA(); //ValueB
BTemp.printA(); //printB     --->结果.
BTemp.valueA(); //ValueB
}
}
}我不明白.ATemp.printA(); 这输出结果为什么是printAA ATemp = BTemp;这句不是ATemp指向BTemp吗.. 
ATemp.printA();方法不是就是BTemp.printA()吗.
即结果为:printB吗... ATemp.valueA(); //ValueB
这个结果证明ATemp指向BTemp吧...我不知道我那里分析错了...???

解决方案 »

  1.   

    不是你想的那样,你定义的是A ATemp,然后把BTemp的实例给了它,但是它并没有指向B,因为你是用A 来定义的,只不过你把A中的value在B中复写了,而且value也是虚函数,所以自然就继承了B中的value,但是print不是虚函数,所以不行。
      

  2.   

    不是你想的那样,你定义的是A ATemp,然后把BTemp的实例给了它,但是它并没有指向B,因为你是用A 来定义的,只不过你把A中的value在B中复写了,而且value也是虚函数,所以自然就继承了B中的value,但是print不是虚函数,所以不行
    ------------------------------------
    好像是这样哦...
      

  3.   

    调试时 ATemp 是B类形B中的printA()...new好像没起到作用??
      

  4.   

    楼主的面向对象的概念似乎还不大清楚对于第一种情况
    A ATemp = new B(); 
    ATemp.printA();
    由于printA()并不是一个虚方法,而且在B中是这样定义的new public void printA(){},这个new的意思是说这个方法是专属于类B的,和类A一点关系都没有 
    ATemp.printA();也绝对不等价于BTemp.printA(); ATemp只是一个对象的引用,并不是真正的一个对象,由于派生类的对象总是可以看做是一个基类对象,所以A ATemp = new B(); 这句话是成立的,但并不代表ATemp就是B类的对象!
    对于第二种情况
    ATemp.valueA();只所以出来的结果是ValueB,那是因为B中是这样定义的public override void valueA(){},override代表子类覆盖了父类的方法,但ATemp仍是个指向基类的对象的引用,当有和父类同名且参数列表相同的方法时,会调用子类的方法,这也正是面向对象编程多态的特征,但不代表ATemp是B类的对象,不然你在B类随便试试加一个方法,看看ATemp是否能调用这些概念建议楼主多看看相关的书籍吧
      

  5.   


    B BTemp=new B(); 
    A ATemp=BTemp;  
    ATemp.printA();
    我还是不很明白为什么ATemp.printA()调用的printA()不是BTemp中的printA()
    B是A的子类..
    A ATemp=BTemp;  
    ATemp.printA();
    不是等同于 
    BTemp.printA();吗。。
      

  6.   

    ATemp只是一个对象的引用,并不是真正的一个对象,由于派生类的对象总是可以看做是一个基类对象
      

  7.   

    ATemp 是 A类对象的一个引用
      

  8.   

    你好,你的源码我试了,我退出那个群了。我是“何飞”,你那个问题我想用“类型转换”来理解就对了。你可以看一下这方面的资料。<<C#类设计手册>>上有这些知识。因为你的
    A ATemp
    B BTemp
       它们不是同一类型。你那样(A Atemp=new B)并不是把B的引用给A。而是把B转换为A。
    我最后把那个NewPrintA方法加到A中就没出错了。我认为这样理解更好点,不知道是不是对的。我认为那样的面试题是看你会不会让表面现像迷惑。