1、想弄明白为什么C#中基类引用可以引用派生类的对象?
2、new关键字在隐藏基类成员时,依据是什么,为什么可以实现隐藏? 
解决就给分,一题20,决不食言。

解决方案 »

  1.   

    1.这个问题与1+1为什么等于2没什么区别。2.如果签名相同的方法在基类与派生类中都进行了声明,该方法也没有virtual或者override,派生类方法就会隐藏基类方法。
    为什么可以实现隐藏?我也不知道
      

  2.   

    1.这叫多态,也是OOP本身的特点。
    2.new实例化对象的时候执行一个初始化器,初始化器通常也称构造函数,听清楚了,别把这个构造函数当做很神圣的东西,也就是个方法成员,凭什么不让隐藏掉?
      

  3.   

    1. 多态, CLR在运行时可以把父类的引用指向子类的实例。 在编译期间的类型安全是由编译器确定的。2. new 也是c#的关键词吧。 CLR确保在运行时用你new的这个方法可以覆盖父类的同名方法。
      

  4.   

    1. 多态, CLR在运行时可以把父类的引用指向子类的实例。 在编译期间的类型安全是由编译器确定的。
    ================================================================================
    不同类型的指向为什么不出错?
    C#可是强类型语言。2. new 也是c#的关键词吧。 CLR确保在运行时用你new的这个方法可以覆盖父类的同名方法。
    ================================================================================
    如何实现的?
     
      

  5.   

    1、想弄明白为什么C#中基类引用可以引用派生类的对象?  我自作聪明,把问题修改一下。其实你想问的是赋值兼容问题,即
      为什么可以把派生类变量赋给基类变量,而反过来不可以。举例:
        
          Animal a1;
          Cat c1 = new Cat();
          a1 = c1;    //  正确
          c1 = a1;    //  不对    
      翻译成自然语言的话,上面的第三句是说,一个猫是一个动物,第四
      句则是说,一个动物是一个猫。显然动物不只是猫,也有可能是只老
      鼠。从编程的角度来解释,基类的接口是派生类的子集,将派生类变
      量赋给基类变量就是取接口的一部分,这会丢失一些信息,但不会引
      起错误,不论你调用什么方法,在运行时,实际的对象都一定具有这
      个方法。反过来,把基类变量赋值给派生类变量则是扩大接口,扩大
      的部分就是派生类有而基类没有的方法。当调用派生类的方法时,不
      能保证实际的对象中有这个方法。  当然并不是说基类变量一定不能赋值给派生类,可以用强制转换达到
      这一目的。例如:      c1 = (Cat)a1;    // 行了  这样就能编译了。不过在运行时,如果 a1 引用的对象不是 Cat(或其
      子类),则会引发 InvalidCastException 异常。这是 C# 最值得赞美
      的特性之一,也就是常说的类型安全。在 C++ 中,使用强制转换语法
      可以把指针从一个类型随意转换成另一类型,在运行时,没有异常产生,
      程序运行正常,只是结果不对,接下来就是艰难的排错任务。2、new关键字在隐藏基类成员时,依据是什么,为什么可以实现隐藏?
      
      面向对象语言具有多态性,主要是指虚函数。在C#中,有几个专门针对
      虚函数的关键字:virtual, override, sealed, new,如果基类有一个
      虚方法 M,派生类也有这个方法,那么派生类有两种选择:override 
      或者 new。override 是指重写基类的虚方法,而 new 则指示派生类的
      M 和基类的 M 没有什么关系。这会影响运行时的调用行为:
      
       // 假定 Animal 有一个虚方法 Run,
       Animal a = new Cat();
       a.Run();  
     
      如果 Cat.Run 是 override,那么 a.Run,就会调用到 Cat.Run,表现出
      多态性。如果 Cat.Run 是 new,那么 a.Run 就会调用到 Animal.Run。
      概括一下,就是:如果 override,则调用运行时类型(Cat)的方法,如果
      是 new,则调用编译时类型(Animal)的方法。
    这两个问题是C#语言中最基本的问题,有点零碎,但其实是很好懂的。
      

  6.   

    1.应用是类的继承关系来考虑。
    2.在new 的时候有构造函数呀,通过构造函数来考虑。
      

  7.   

    多谢楼上的各位帮忙,尤其是photoplan的生动举例。
    不过关于为什么会可以这样来实现,好像各位都没有说出个所以然来
    我请教了朋友帮我作答
    问题已解决
    再次感谢各位
    (赫赫,还真是微软的朋友帮忙的,盖斯手下的绝对正宗如假包换,牛人就是牛人)        0ZM