日期:2014-05-18  浏览次数:20757 次

高分请教简单的小问题,请大家帮帮(C#引用)
1、想弄明白为什么C#中基类引用可以引用派生类的对象?
2、new关键字在隐藏基类成员时,依据是什么,为什么可以实现隐藏?  


解决就给分,一题20,决不食言。

------解决方案--------------------
1.这个问题与1+1为什么等于2没什么区别。

2.如果签名相同的方法在基类与派生类中都进行了声明,该方法也没有virtual或者override,派生类方法就会隐藏基类方法。
为什么可以实现隐藏?我也不知道
------解决方案--------------------
1.这叫多态,也是OOP本身的特点。
2.new实例化对象的时候执行一个初始化器,初始化器通常也称构造函数,听清楚了,别把这个构造函数当做很神圣的东西,也就是个方法成员,凭什么不让隐藏掉?
------解决方案--------------------
1. 多态, CLR在运行时可以把父类的引用指向子类的实例。 在编译期间的类型安全是由编译器确定的。

2. new 也是c#的关键词吧。 CLR确保在运行时用你new的这个方法可以覆盖父类的同名方法。
------解决方案--------------------
那是编译器做的~~有种把IL学会了~~~
------解决方案--------------------
去问盖茨吧!
------解决方案--------------------
怎么实现的~~~可以写一本书了~~


可以先看《编译原理》相关书籍~~
------解决方案--------------------
也想知道原因
------解决方案--------------------
1、想弄明白为什么C#中基类引用可以引用派生类的对象?

我自作聪明,把问题修改一下。其实你想问的是赋值兼容问题,即
为什么可以把派生类变量赋给基类变量,而反过来不可以。举例:

Animal a1;
Cat c1 = new Cat();
a1 = c1; // 正确
c1 = a1; // 不对


翻译成自然语言的话,上面的第三句是说,一个猫是一个动物,第四
句则是说,一个动物是一个猫。显然动物不只是猫,也有可能是只老
鼠。从编程的角度来解释,基类的接口是派生类的子集,将派生类变
量赋给基类变量就是取接口的一部分,这会丢失一些信息,但不会引
起错误,不论你调用什么方法,在运行时,实际的对象都一定具有这
个方法。反过来,把基类变量赋值给派生类变量则是扩大接口,扩大
的部分就是派生类有而基类没有的方法。当调用派生类的方法时,不
能保证实际的对象中有这个方法。

当然并不是说基类变量一定不能赋值给派生类,可以用强制转换达到
这一目的。例如:

c1 = (Cat)a1; // 行了

这样就能编译了。不过在运行时,如果 a1 引用的对象不是 Cat(或其
子类),则会引发 InvalidCastException 异常。这是 C# 最值得赞美
的特性之一,也就是常说的类型安全。在 C++ 中,使用强制转换语法
可以把指针从一个类型随意转换成另一类型,在运行时,没有异常产生,
程序运行正常,只是结果不对,接下来就是艰难的排错任务。

2、new关键字在隐藏基类成员时,依据是什么,为什么可以实现隐藏?

面向对象语言具有多态性,主要是指虚函数。在C#中,有几个专门针对
虚函数的关键字:virtual, override, sealed, new,如果基类有一个
虚方法 M,派生类也有这个方法,那么派生类有两种选择:override
或者 new。override 是指重写基类的虚方法,而 new 则指示派生类的
M 和基类的 M 没有什么关系。这会影响运行时的调用行为:

// 假定 Animal 有一个虚方法 Run,
Animal a = new Cat();
a.Run();

如果 Cat.Run 是 override,那么 a.Run,就会调用到 Cat.Run,表现出
多态性。如果 Cat.Run 是 new,那么 a.Run 就会调用到 Animal.Run。
概括一下,就是:如果 override,则调用运行时类型(Cat)的方法,如果
是 new,则调用编译时类型(Animal)的方法。


这两个问题是C#语言中最基本的问题,有点零碎,但其实是很好懂的。

------解决方案--------------------
楼上的回答不错
------解决方案--------------------
LSS说的好!
------解决方案--------------------
学习
------解决方案--------------------
UP
------解决方案--------------------
多态,回去看下书。