重写和隐藏的问题
class Father
{
public virtual void printf()
{
Console.WriteLine("father");
}
}
class Children:Father
{
public override void printf()
{
Console.WriteLine("children");
}
}
class GrandChildren:Children
{
public new void printf()
{
Console.WriteLine("GrandChildren");
}
}
这时
Father aaa = new GrandChildren();
aaa.printf();
会打印出"children"
为什么不是"father"呢?
不是说在用new隐藏父类函数的时候,调用哪个方法是取决于引用实例的变量类型吗?
这里aaa是声明的Father类型啊?
哪位xdjm解释一下
问题点数:100、回复次数:16Top
1 楼Eddie005(♂) №.零零伍 (♂)回复于 2006-06-01 00:20:54 得分 10
取决于实力化的类型!Top
2 楼Eddie005(♂) №.零零伍 (♂)回复于 2006-06-01 00:21:45 得分 0
取决于实例化的类型!Top
3 楼saucer(思归)回复于 2006-06-01 00:24:48 得分 50
class GrandChildren:Children
{
//这里说,我另立门户,我这个printf()与继承来的虚拟printf()有所不同
但GrandChildren本身还是Children啊
public new void printf()
{
Console.WriteLine("GrandChildren");
}
}
当你调用
Father aaa = new GrandChildren();
aaa.printf();
这个printf()指的是Father中可覆盖的虚拟printf(),在运行是会在实际对象中找,实际对象是个GrandChildren,它是从Children的继承来的,Children覆盖了printf(),所以,最后调用的是Children里的printf()
如果你这么做,那么你的输出才会是father
class Children:Father
{
public new void printf()
{
Console.WriteLine("children");
}
}Top
4 楼chengbo1983(chengbo.net)回复于 2006-06-01 00:28:07 得分 3
public new void printf()
{
Console.WriteLine("GrandChildren");
}
这样就与多态没关系了,它只是新建了一个同名的方法,将重父类继承来的给覆盖了
你可以查查多态的资料Top
5 楼zdjray(.Net的名字)回复于 2006-06-01 01:21:57 得分 3
调用的是当前被指向对象的父类的方法Top
6 楼ProjectDD()回复于 2006-06-01 06:38:05 得分 3
当然取决于new的什么东西了,楼主太学院化了..new什么是什么,因为基类所在你可以声明但反过来就不行,因为了类对基类是可扩充的,这样会造成"溢出"(我没试过用了类声明基类构造,请问到底可不可以?应该有个规则限制其不可以,但为什么不可以我无法解释..因为一个的构造本来就可以不写都不存在的)Top
7 楼amandag(高歌)回复于 2006-06-01 07:07:44 得分 3
同意楼上的各位,可以用来做考试题Top
8 楼liujiwe79(专业做控件)回复于 2006-06-01 10:45:47 得分 10
类型固然是Father,但是你实例化的时候却是实例化的GrandChildren,而在GrandChildren类中,你是隐藏了printf(),所以会调用Children得printf(),如果你得GrandChildren类中,方法也为重载得话,应该打印出GrandChildren的Top
9 楼yizhiguanian(1只瓜年)回复于 2006-06-01 11:13:38 得分 3
取决于实例化的类型,而非接口类型。Top
10 楼kssys()回复于 2006-06-01 11:20:13 得分 3
取决于实例化。
参看C#规范1.0第2xx页,关于虚方法VirtualTop
11 楼nanxi0532()回复于 2006-06-01 11:27:43 得分 3
因为你父类的方法为Virtual在子类中又给重写了所以当然是调用重写过得方法
去看看Virtual的定义吧Top
12 楼xinlang123chao()回复于 2006-06-01 11:40:50 得分 3
学习Top
13 楼Samen168(Code to coding)回复于 2006-06-01 12:01:05 得分 3
该说的说了,不该说的也说了,呵呵Top
14 楼zlkingdom(风之悲伤)回复于 2006-06-01 14:09:51 得分 3
呵呵,应该是个考题吧,虚函数的问题,多看看资料就可以了Top
15 楼nan7757(骑着蚂蚁闯红灯)回复于 2006-06-01 14:18:29 得分 0
牛人众多,学习。。Top
16 楼wumylove1234(毁于随)回复于 2006-06-02 09:59:57 得分 0
温习了.Top




