初学者,问题浅薄,基础不够。还望见谅!
  Base_Class  baseclass = new Derived_Class();
  Derived_Class derivedclass = new Derived_Class();  在内存中的代码段有区别吗?前面的声明不同究竟导致他们的区别在哪里?
  在调用基类和父类中的方法时局限性体现在哪?
 (我是在看overide和new的区别时被弄纠结的。)还请大家讲解一下,麻烦了。

解决方案 »

  1.   

    不想多说啥了,这东西用语言说不清楚,需要画图你自己去找“你必须知道的.net” 或者"clr via C#",这两本书讲的很详细,插图也配的很好你把图一看就明白了[你必须知道的.NET]
    第十五回:继承本质论
    [你必须知道的.NET]第十九回:对象创建始末(下)
      

  2.   


    LZ,Override是重写的意思。Base_Class baseclass = new Derived_Class(); 一个基类的的声明指向一个子类的实现。new是重写分配了内存空间,有没实现还的看具体实现。
      

  3.   


    比如说:举个例子:new是覆盖override是重载。 “覆盖”并不意味着“删除” 示例 
    using   System; 
    class   A 

          public   void   F()   
          { 
                Console.WriteLine( "A.F ");   
          } 

    class   B:   A 

          new   public   void   F()   
          {   
                Console.WriteLine( "B.F ");   
          } 

    class   Test 

          static   void   Main()   
          { 
                B   b   =   new   B(); 
                b.F(); 
                A   a   =   b;   
                a.F(); 
          } 

    输出为 
    B.F 
    A.F 但“重载”意味着“删除”,这就是“覆盖”和“重载”的区别。 示例 
    using   System; 
    class   A 

          public   virtual   void   F()   
          { 
                Console.WriteLine( "A.F ");   
          } 

    class   B:   A 

          public   override   void   F()   
          {   
                Console.WriteLine( "B.F ");   
          } 

    class   Test 

          static   void   Main()   
          { 
                B   b   =   new   B(); 
                b.F(); 
                A   a   =   b;   
                a.F(); 
          } 

    输出的为 
    B.F 
    B.F 
      

  4.   

    overide和new 的区别,实际只是看修改的对象在内存的那个部分overide 修改的是stack 代码段部分,但loderHeap堆中方法表没有更改,他任然指向stack相同偏移量的位置,但是stack那个位置的代码被修改了,我个人把这叫做“偷梁换柱”,不管怎么说材料已经变了。new 修改的loderHeap中的方法表,他把方法表中的同名指向指到stack上的另外一个偏移量上了,但是父类的代码其实任然存在,只是目前方法表没指向他,这个我个人叫“指鹿为马”,这子类里面把马这个指向指到鹿身上了,但是父类里马还是马
      

  5.   

    ???啥意思1楼被版主删了,难道c*s*d*n给你们版版下了任务,不准给antao打广告???
      

  6.   

    @ZhiZhuoChangeIng  @wanghui0380    谢谢你们通俗的讲解。。
    但是我突然有个小小的问题。结合你俩的讲解
    如果在ZhiZhuoChangeIng 的代码中我增加一下这段:class C:A
    {
       public override void F()   
      {   
      Console.WriteLine( "C.F ");   
      }  
    }按照我对wanghui0380 的这段话的理解
    “overide 修改的是stack 代码段部分,但loderHeap堆中方法表没有更改,他任然指向stack相同偏移量的位置,但是stack那个位置的代码被修改了,我个人把这叫做“偷梁换柱”,不管怎么说材料已经变了。”是说这是之前class B 的override那段代码是也应该被覆盖了是吗?我可以理解我一标明了vitural就相当于我在stack里留了一段空,让我的继承者来填充?
    我琢磨着我理解的不对。。因为这样的话,在测试类 class Test中我既不是不可以调用B.F()?谢谢(最后纪念一下我没有看到的一楼)
      

  7.   

    是说这是之前class B 的override那段代码是也应该被覆盖了是吗?我可以理解我一标明了vitural就相当于我在stack里留了一段空,让我的继承者来填充=======================差不多可以这样理解,当然vitural不是强制非要让子类去填空,他只是说可以填可以不填,不填就用父类的,填了就用子类的ps:实际上面说的内部原理部分,就掌握和使用上记住一句话就成“方法调用使用就近原则”,对于同名方法,从当前实例套用的方法表出发,按继承关系追溯,谁离的最近就用谁的
    具体可以看这里
    http://www.cnblogs.com/TextEditor/archive/2010/05/25/1743539.html
      

  8.   

    比如说你写A a = new B();那么变量a就兼容于B对象。就好象张柏芝也是女人、也是明星,也是母亲,你不能说“白马不是马”,你要理解抽象的含义。其实它说的就是(is-a)同一个东西,只不过定义变量时使用的接口不同而已。
      

  9.   

    又被吃了1楼这样把,上面说的是本质实现一类的玩意,实际上就使用上我们记住一句话就成“同名方法调用遵循就近原则”
    具体可以看这里http://www.cnblogs.com/TextEditor/archive/2010/05/25/1743539.htmlps:我们的确可以在c里调用B的F()方法,因为我们有base关键字,你在C的F里使用Base关键字就可以就近调用上一层的同名方法
    public override void F()   
      {   Base。F();
      Console.WriteLine( "C.F ");   
      }   
      

  10.   

    基类的皮可以包含 子类的实例
    但子类的皮不能包含基类的实例object o=new Customer();//ok
    Customer c=new object();//error
      

  11.   

    object o=new Customer();//ok
    Customer c=new object();//errorandCustomer c=o;//ok  此种情况是通过基类做中转,面向对象的基础操作