CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  .NET技术 >  C#

重写和隐藏的问题

楼主anzy(安子)2006-06-01 00:08:11 在 .NET技术 / C# 提问

class   Father  
    {  
      public   virtual   void   printf()  
      {  
        Console.WriteLine("father");  
      }  
    }  
   
    class   Children:Father  
    {  
      public   override   void   printf()  
      {  
        Console.WriteLine("children");  
      }  
    }  
   
    class   GrandChildren:Children  
    {  
      public   new   void   printf()  
      {  
        Console.WriteLine("GrandChildren");  
      }  
    }  
   
   
  这时  
        Father   aaa   =   new   GrandChildren();  
        aaa.printf();  
   
  会打印出"children"  
   
  为什么不是"father"呢?  
   
  不是说在用new隐藏父类函数的时候,调用哪个方法是取决于引用实例的变量类型吗?  
   
  这里aaa是声明的Father类型啊?  
   
  哪位xdjm解释一下  
  问题点数:100、回复次数:16Top

1 楼Eddie005(♂) №.零零伍 (♂)回复于 2006-06-01 00:20:54 得分 10

取决于实力化的类型!Top

2 楼Eddie005(♂) №.零零伍 (♂)回复于 2006-06-01 00:21:45 得分 0

取决于实例化的类型!Top

3 楼saucer(思归)回复于 2006-06-01 00:24:48 得分 50

class   GrandChildren:Children  
    {  
  //这里说,我另立门户,我这个printf()与继承来的虚拟printf()有所不同  
  但GrandChildren本身还是Children啊  
   
      public   new   void   printf()  
      {  
        Console.WriteLine("GrandChildren");  
      }  
    }  
   
  当你调用  
  Father   aaa   =   new   GrandChildren();  
  aaa.printf();    
   
  这个printf()指的是Father中可覆盖的虚拟printf(),在运行是会在实际对象中找,实际对象是个GrandChildren,它是从Children的继承来的,Children覆盖了printf(),所以,最后调用的是Children里的printf()  
   
  如果你这么做,那么你的输出才会是father  
   
  class   Children:Father  
    {  
      public   new   void   printf()  
      {  
        Console.WriteLine("children");  
      }  
    }Top

4 楼chengbo1983(chengbo.net)回复于 2006-06-01 00:28:07 得分 3

public   new   void   printf()  
      {  
        Console.WriteLine("GrandChildren");  
      }  
   
  这样就与多态没关系了,它只是新建了一个同名的方法,将重父类继承来的给覆盖了  
  你可以查查多态的资料Top

5 楼zdjray(.Net的名字)回复于 2006-06-01 01:21:57 得分 3

调用的是当前被指向对象的父类的方法Top

6 楼ProjectDD()回复于 2006-06-01 06:38:05 得分 3

当然取决于new的什么东西了,楼主太学院化了..new什么是什么,因为基类所在你可以声明但反过来就不行,因为了类对基类是可扩充的,这样会造成"溢出"(我没试过用了类声明基类构造,请问到底可不可以?应该有个规则限制其不可以,但为什么不可以我无法解释..因为一个的构造本来就可以不写都不存在的)Top

7 楼amandag(高歌)回复于 2006-06-01 07:07:44 得分 3

同意楼上的各位,可以用来做考试题Top

8 楼liujiwe79(专业做控件)回复于 2006-06-01 10:45:47 得分 10

类型固然是Father,但是你实例化的时候却是实例化的GrandChildren,而在GrandChildren类中,你是隐藏了printf(),所以会调用Children得printf(),如果你得GrandChildren类中,方法也为重载得话,应该打印出GrandChildren的Top

9 楼yizhiguanian(1只瓜年)回复于 2006-06-01 11:13:38 得分 3

取决于实例化的类型,而非接口类型。Top

10 楼kssys()回复于 2006-06-01 11:20:13 得分 3

取决于实例化。  
   
  参看C#规范1.0第2xx页,关于虚方法VirtualTop

11 楼nanxi0532()回复于 2006-06-01 11:27:43 得分 3

因为你父类的方法为Virtual在子类中又给重写了所以当然是调用重写过得方法  
  去看看Virtual的定义吧Top

12 楼xinlang123chao()回复于 2006-06-01 11:40:50 得分 3

学习Top

13 楼Samen168(Code to coding)回复于 2006-06-01 12:01:05 得分 3

该说的说了,不该说的也说了,呵呵Top

14 楼zlkingdom(风之悲伤)回复于 2006-06-01 14:09:51 得分 3

呵呵,应该是个考题吧,虚函数的问题,多看看资料就可以了Top

15 楼nan7757(骑着蚂蚁闯红灯)回复于 2006-06-01 14:18:29 得分 0

牛人众多,学习。。Top

16 楼wumylove1234(毁于随)回复于 2006-06-02 09:59:57 得分 0

温习了.Top

相关问题

关键词

得分解答快速导航

  • 帖主:anzy
  • Eddie005
  • saucer
  • chengbo1983
  • zdjray
  • ProjectDD
  • amandag
  • liujiwe79
  • yizhiguanian
  • kssys
  • nanxi0532
  • xinlang123chao
  • Samen168
  • zlkingdom

相关链接

  • CSDN .NET频道
  • .NET类图书
  • C#类图书
  • .NET类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo