C#override的疑问

q380472335q 2011-06-01 06:12:23
namespace ConsoleApplication1
{
public class Program
{
protected string name;
public Program()
{
Console.WriteLine("Program无参构造方法");
}
public virtual void pp()
{
Console.WriteLine("Program无参虚方法");
}
}

public class Person : Program
{
Person()
{
Console.WriteLine("Person无参构造方法");
}

static void Main(string[] aegs)
{
p2.pp();
((Program)p2).pp();//---------①
Console.ReadKey();
}
public override void pp()
{
Console.WriteLine("Person无参方法");
//base.pp();//----------------②
}
}
}

①处是类的上载吧? 把p2强制转换为Program类的对象,调用的是Program类里的方法吧?

override是把父类的pp方法改写了 还是 只是把父类的方法隐藏了重写了属于自己的方法(那和new有什么区别)?
为什么我把②处的语句注释后,输出的全是"Person无参方法"
把②处的注释去掉后,输出的就是"Person无参方法";"Program无参虚方法"?

思路有点混乱了..究竟我在①处的理解错误还是override理解错误了?
...全文
588 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
BurgessLi 2011-06-02
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 remember_me 的回复:]

override是重写父类的方法

父类中具有abstract抽象方法,或者virtual虚方法的时候,在子类中需要进行重写。
[/Quote]

今天才算是明白.....
爱在西元前 2011-06-02
  • 打赏
  • 举报
回复
override:重写
new:隐藏(不加override也不加new 默认的是隐藏)
kingdom_0 2011-06-02
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 q380472335q 的回复:]

引用 5 楼 awayy1432 的回复:

override应该是改写了
用new才是隐藏



new不是重新定义了一个属于子类自身的方法,只是方法名和父类的方法名一样么?
override 是重写了父类的虚方法,并没有改变父类虚方法本身是吧?

还有哪个①处,我设了定点,看到那个p2是Person类型的,并不是强制转换成Program类型了,还是Person类型
Pr……
[/Quote]
override:重写
new:隐藏
remember_me 2011-06-02
  • 打赏
  • 举报
回复
override是重写父类的方法

父类中具有abstract抽象方法,或者virtual虚方法的时候,在子类中需要进行重写。
q380472335q 2011-06-01
  • 打赏
  • 举报
回复
为什么父类的p方法定义为虚方法,子类用override覆盖后,
用((Program)p2).p(); 是调用子类的p方法,而不是调用父类的p方法?

当把父类的p方法的virtual和子类的override去掉后,
用((Program)p2).p(); 变成了调用父类的p方法,不会去调用子类的了!

为什么加上virtual变成虚方法后就会这样去调用子类的不调用父类的?
q380472335q 2011-06-01
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 awayy1432 的回复:]

override应该是改写了
用new才是隐藏

[/Quote]

new不是重新定义了一个属于子类自身的方法,只是方法名和父类的方法名一样么?
override 是重写了父类的虚方法,并没有改变父类虚方法本身是吧?

还有哪个①处,我设了定点,看到那个p2是Person类型的,并不是强制转换成Program类型了,还是Person类型
Program p = (Program)p2; 类型依然是Person,而不是Program,这就是多态的特征?
脾气不坏 2011-06-01
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 sp1234 的回复:]

不要强制类型转换就是复制出来一个新的Program对象实例 --> 不要以为强制类型转换就是复制出来一个新的Program对象实例


要去了解继承和多态,一定要从OO设计的知识去理解,千万不要仅仅用传统的结构化的低级的编程思路去理解。否则可能你关注与一些错误的编程伎俩,而在设计思路上反而陷入理解不了多态技术的地步。
[/Quote]

明白了
脾气不坏 2011-06-01
  • 打赏
  • 举报
回复
override应该是改写了
用new才是隐藏

参考
  • 打赏
  • 举报
回复
不要强制类型转换就是复制出来一个新的Program对象实例 --> 不要以为强制类型转换就是复制出来一个新的Program对象实例


要去了解继承和多态,一定要从OO设计的知识去理解,千万不要仅仅用传统的结构化的低级的编程思路去理解。否则可能你关注与一些错误的编程伎俩,而在设计思路上反而陷入理解不了多态技术的地步。
  • 打赏
  • 举报
回复
假设在别处有这样一个方法
void todo(Program p2)
{
.....
p2.pp();
.....
}

现在你把你的p2变量作为这个todo方法的p2参数来调用它,它调用的是Person的pp方法。但是假设Person没有定义自己的pp方法,它会使用继承的Program的pp方法。并且尽管是调用Program的pp方法,当前被处理的对象自身是什么类型的?是Person类型而不是Program类型的。这就是多态的意思。
  • 打赏
  • 举报
回复
[Quote=引用楼主 q380472335q 的回复:]
①处是类的上载吧? 把p2强制转换为Program类的对象,调用的是Program类里的方法吧?

override是把父类的pp方法改写了 还是 只是把父类的方法隐藏了重写了属于自己的方法(那和new有什么区别)?
为什么我把②处的语句注释后,输出的全是"Person无参方法"
把②处的注释去掉后,输出的就是"Person无参方法";"Program无参虚方法"?
[/Quote]
把p2变量强制类型转换为Program类型,编译器看到它们类型兼容,那么什么也不做,只不过是编译器允许正确地编译而已。你可以修改为
Program p3 = p2;
p3.pp();
或者
Program p3 = (Program)p2;
p3.pp();
试一试,p3都是指向最初实例化的p2同一个对象。你的整个程序中也没有出现一个Program对象实例,只不过有一个Person对象实例。不要强制类型转换就是复制出来一个新的Program对象实例。
lpingz 2011-06-01
  • 打赏
  • 举报
回复
使用override,是说把基类的方法重新定义

使用new,是重新定义一个子类方法,只不过,方法名称与基类相同

用virtual才可以在子类中用override,而new不需要这样

110,566

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧