一道理解c#中对象(引用类型)相互赋值和方法覆盖(overriding)的题目

昨天发现有些错误,特此更正。
程序如下:今天不能用插入代码烦死了,直接来了

using System;
ClassA
{
public virtual void M()
{
Console.WriteLine("A");
}
}
ClassB:ClassA
{
public override void M()
{
Console.WriteLine("B");
}
}
ClassC:ClassB
{
new public virtual void M()
{
Console.WriteLine("C");
}
}
ClassD:ClassC
{
public override void M()
{
Console.WriteLine("D");
}
[STAThread]
static void Main(string[] args)
{
D d=new D();
C c=d;
B b=c;
A a=b;
//分别调用一下这几个对象中的M方法
D.M();
C.M();
B.M();
A.M();
}
}

程序的输出结果:
D
D
B
B

题目就是让写出程序输出结果。
此题中C c=d;B b=c;A a=b;这几句是考察对象间赋值,对象是引用类型,相互不能直接传递数据,赋值后仅仅是传递了指向相应对象地址的指针。就相当于转变为另外对象。
昨天又看了这段,有新感想,写出来共享。
在执行 C c=d; 后并不是简单的传递了指向对象的指针,而是把D类型的d转换为C类型的c了,由于M()为覆盖方法,虽然d被转换为C类型的对象了但仍然要调用D类型的M()方法,这就实现了转换后覆盖父类方法的目的。而用new 重写的方法则不能,是因为此方法与父类的同样的方法已经没有关系,尽管模样一样。而且覆盖(override)还可以通过继承树传递,只要中间不间断,就可以一直向父类传递直至最终父类。

转载于:https://www.cnblogs.com/lazhgg/archive/2006/01/08/313405.html

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:编程工作室 设计师:CSDN官方博客 返回首页
评论
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值