A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 郑丹丹1990 中级黑马   /  2013-5-17 08:18  /  1507 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 郑丹丹1990 于 2013-5-17 08:24 编辑
  1. namespace 继承
  2. {
  3. class Program
  4. {
  5. static void Main(string[] args)
  6. {
  7. son s = new son("xioaming", 23, 175);
  8. Console.WriteLine(s.Height);
  9. s.SayHello();
  10. s.speak();
  11. Father f = (Father)new son("tom", 40, 180);
  12. f.speak();
  13. Console.ReadKey();
  14. }
  15. }
  16. public class Father
  17. {
  18. public string Name { get; set; }
  19. public int Age { get; set; }
  20. public double Height { get; set; }
  21. public Father(string name,int age, double height)
  22. {
  23. this.Name=name;
  24. this.Age=age;
  25. this.Height=height;
  26. }
  27. public void SayHello()
  28. {
  29. Console.WriteLine("father.sayhello()");
  30. }
  31. public virtual void speak()
  32. {
  33. Console.WriteLine("father.virtual.speak()");
  34. }
  35. }
  36. public class son:Father
  37. {
  38. public son(string name, int age, double height)
  39. : base(name, age, height)
  40. {
  41. this.Name = name;
  42. this.Age = age;
  43. this.Height = height;
  44. }
  45. public override void speak()
  46. {
  47. Console.WriteLine("son.speak()");
  48. }
  49. }
  50. }
复制代码
f.speak()是调用子类的方法??这是为什么呀?不是已经把Son强制转化为Father了吗?为何不调用基类中的方法?
另:若把son中的speak()方法的override换成new,则会调用父类方法。这又是为何??

评分

参与人数 1技术分 +1 收起 理由
杞文明 + 1

查看全部评分

3 个回复

倒序浏览
因为你的是子类继承父类,所以说子类的speak方法重写(覆盖)了父类的同名方法。还有就是子类是不可以强制转换为父类的,但是可以定义一个父类类型的引用指向一个子类的对象!换成new的话子类的speak方法就不会覆盖父类的speak方法了。
回复 使用道具 举报
当类中的方法声明前加上了virtual修饰符,该方法被称之为虚拟方法。对于虚拟方法,它的执行方式可以被派生类改变,这种改变是通过方法的重载来实现的。父类中的一个方法只有在在父类中定义而在子类中没有重写的情况下,才可以被父类类型的引用调用;对于父类中定义的方法,如果子类中重写了该方法,那么父类类型的引用将会调用子类中的这个方法。题中由于father类中的speak方法在子类son中被重写,所以会调用子类中的speak方法。
回复 使用道具 举报
王朋 发表于 2013-5-18 08:39
当类中的方法声明前加上了virtual修饰符,该方法被称之为虚拟方法。对于虚拟方法,它的执行方式可以被派生类 ...

:handshake学写了!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马