关于虚方法的 override和new的理解,在父类对象引用子类实例时调用被override或new的方法时的理解。

可以这样理解吗?将子类继承还有虚方法的父类时,如果不写这个虚方法,就表示默认继承了父类的这个方法,用override重写这个方法就表示继承了这个虚方法,然后对其进行了修改... 可以这样理解吗?将子类继承还有虚方法的父类时,如果不写这个虚方法,就表示默认继承了父类的这个方法,用override重写这个方法就表示继承了这个虚方法,然后对其进行了修改。如果用new重写这个方法,表示子类的这个方法与父类的是2个不同的方法。用override重写的话,用父类的对象引用子类实例时,父类对象调用这个虚方法,运行的其实是子类override的方法,我不明白的就是override是直接修改了父类的虚方法吗?因为父类调用方法是只能调用父类自己有的方法呀,它看不到子类的方法。难道是override的方法是修改父类的虚方法在继承到子类的么?可是这样的话连续2个子类override虚方法,父类的虚方法会是最后一次override的内容,可我通过实验否定了,2个子类override父类虚方法后,用父类对象引用这2个子类的实例,调用虚方法都是每个子类里自己改写的方法。所以我很不理解override的机制到底是什么?
例如
public class A
{ public virtual void Show(){Console.WriteLine("A.Show()"); }
public class B : A
{ public override void Show(){Console.WriteLine("B.Show()");} }
public class C : A
{ public override void Show(){Console.WriteLine("C.Show()");} }
public class Program
{
static void Main(string[] args)
{
A b = new B();
A c = new C();
b.Show();
c.Show();
}
}
结果为:B.Show() C.Show()
展开
 我来答
夜_男爵
推荐于2016-07-02 · 超过10用户采纳过TA的回答
知道答主
回答量:16
采纳率:0%
帮助的人:23.5万
展开全部
A b = new B(); //注意这里,你new的是子类B,所以b不能称之为父类A的实例
A c = new C(); // 同上
b.Show(); //这里的b实际上是子类B的实例,所以调用的show方法是在B类里重写后的方法
c.Show(); //同上

如果你想调用A类里的方法就不能那样写,要这样写:
A b = new A();
A c = new A();
b.Show();
c.Show();
这样输出的结果就是:A.Show() A.Show()
如果看不明白,可以再问我
更多追问追答
追问
A b = new A();
A c = new A();
要是这么写我就明白了,不理解的是用父类对象,引用子类实例时,new 和override父类虚方法的机制。只是看到了表象,A b = new B(); 如果B类中是override修饰父类虚方法,调用b.Show()时,使用的是B类的Show(),如果B()类中是new修饰的,调用b.Show()时,使用的是A类中的Show(),不明白其中的机制是什么,有人说A b =new B(),b的地址是B()的引用,但是这怎么说明B中2中不同的修饰,掉用的结果不同
追答
父类对象引用子类实例,然后调用方法时,调用的是父类里的方法,如果子类重写了,就调用重写后的方法(PS:重写方法是在实例化对象的过程中实现的,即你引用哪个子类,就调用哪个子类里重写的方法,不引用则不重写),new是不影响父类方法的,即没有重写父类方法,所以如果子类是new的话,调用的就是父类原有的方法;如果想调用子类new的方法,就要直接用子类实例调用此方法,例如:B类里的show()是new,然后你想调用,你要B b=new B();这是b.show()显示的结果为:B.show()
这样能懂么
km51ce6q0
2011-06-15 · TA获得超过362个赞
知道小有建树答主
回答量:579
采纳率:0%
帮助的人:317万
展开全部

静态方法不能被覆盖来支持多态性,虚函数可以被覆盖。
覆盖和重写是不一样的,覆盖是将父类中定义的函数重新写一个同名实现,在调用时将不能调用父类中的此函数,重写是将父类中定义的函数写一个名称相同,参数类型或数量不同的函数,在调用时父类的同名函数还可以调用。
追问
我试了一下,重写是改变参数数量,编译器告诉我。B.Show(int) : 没有找到适合的方法来重写。。。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式