C#中的override和new在继承中的区别

zhuanmentiwen 2010-06-28 11:16:11
接触C#不久,可能问题比较幼稚,还请大家多多帮忙。
如下:
using System;

namespace Test
{
class Base
{
public Base()
{
Console.WriteLine("base constr");
}
public virtual void show()
{
Console.WriteLine("base show");
}

}

class Derive : Base
{
public Derive()
{
Console.WriteLine("derive constr");
base.show();
}
public override void show()
{
Console.WriteLine("derive show");
}
}

class Program
{
public static void Main(string[] args)
{
Derive d=new Derive();
d.show();

//============================================================
Console.Write("Press any key to continue . . . ");
Console.ReadKey(true);
}
}
}

父类中的show是虚函数,在子类中使用override覆盖了父类的虚函数,为什么在子类的构造函数中还可以访问父类的show方法?
还有,在多态中override和new的区别,有否详细的资料或者讲解下。
还有,C++中的多态是通过延迟绑定,设置虚函数表来实现多态的,在C#中,实现多态的具体机制是怎么样的?
请知道的帮忙解答下,相同的答案下,我会选择前三名来结贴。
...全文
197 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
tyoui17 2010-07-01
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 lxxbluesea 的回复:]
个人认为Override和New都可以覆盖父类方法,区别不太大。
如果非要找出区别,我觉得New可以覆盖没有用virtual 声明的方法,而Override则不行。

如有不对的地方,请指正。
[/Quote]

virtual 声明的方法用new,override都可以重写
tyoui17 2010-07-01
  • 打赏
  • 举报
回复

class baseclass
{
public virtual void writeHello(string outstr)
{
if (string.IsNullOrEmpty(outstr))
Console.Write("father say hello kitty");
else
Console.Write("father say hello" + outstr);
Console.Read();
}
}

class Class1:baseclass
{
public new void writeHello(string outstr)
{
Console.WriteLine("son say hell" + outstr);
}

}

class Program
{
static void Main(string[] args)
{
baseclass test = new Class1();
test.writeHello("tyoui");
Console.ReadLine();

Class1 test1 = new Class1();
test1.writeHello("tyoui");
Console.ReadLine();

}
}


输出结果:father asy hellotyoui
son say hellotyoui

如果把new换成override,输出结果会变成:son say hellotyoui
son say hellotyoui
很直观了吧!
jianuMan 2010-07-01
  • 打赏
  • 举报
回复
override 是覆盖 基类的方法必须使用virtual
new 是隐藏基类的方法

当然 override 也可以隐藏基类的方法 不对基类的方法进行调用
Alden 2010-06-29
  • 打赏
  • 举报
回复
override是重载,new是隐藏.override可以通过父类的引用调用子类的方法,new只能各自调用各自的方法。
lxxbluesea 2010-06-28
  • 打赏
  • 举报
回复
楼上说的可能有问题。Override后,除非你用代码调用父类的方法,不然是不会执行父类的方法。
vip__888 2010-06-28
  • 打赏
  • 举报
回复
override重写后 子方法先调用父类的方法 然后在执行子类的方法

new是直接覆盖
lxxbluesea 2010-06-28
  • 打赏
  • 举报
回复
个人认为Override和New都可以覆盖父类方法,区别不太大。
如果非要找出区别,我觉得New可以覆盖没有用virtual 声明的方法,而Override则不行。

如有不对的地方,请指正。
wuyq11 2010-06-28
  • 打赏
  • 举报
回复
Override主要是提供派生类对基类方法的新实现,重写的基类方法必须和Override的方法具有相同的签名
多态是后期捆定,也就是调用父类还是子类的函数根据实例类型而不是引用类型
Class Base
{
virtual void func()
{
}
}
Class Child:Base
{
override void func()
{
}
}
Base obj = new Child();
obj.func();调用的是子类的func
如果不用virtual/override ,而在Child中使用new
调用父类的func

110,502

社区成员

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

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

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