面试的小问题-多态中的子类与父类函数调用

接到一个电话面试,面试官问了这样一个问题:

如果一个子类继承一个父类,并且该子类重写了父类的一个方法.那么在把一个父类对象强行转化为子类对象后,再执行重写的方法,那调用的是父类还是子类的方法?

听完后就觉得这个问题有点问题--把一个父类强行转化为一个子类,编译通得过吗?

所以我问面试官,您说的是把一个父类引用复制给一个子类引用,还是说直接new一个父类给一个子类?

答:这里不涉及引用的问题,和引用没关系!

我想面试官的问题应该不至于连编译都通不过吧,回答:这种情况那肯定是调用父类的方法了.

回答是:不对,是调用了子类的方法.如果你不信你可以去调试运行看看.

 

挂电话后,怎么想都觉得这个问题有点蹊跷.平时做开发时,在c#中,像这样的情况见到的也不少了,而且肯定是编译不过的,难道在java中就可以了吗?(面试的职位是java开发)

于是决定写点代码跑跑看,到底是怎么回事.好久没做java,一直做.net开发,就不用eclipse了,直接拿vs2008来用.

代码
namespace Generic
{
class Program
{
static void Main(string[] args)
{
Person p
= new Person();
ChinaPerson cp
= (ChinaPerson)p;//(ChinaPerson)new Person();//(ChinaPerson)p;
cp.Printf();
}
}

class Person
{
public void Printf()
{
Console.WriteLine(
"111");
}
}

class ChinaPerson : Person
{
public void Printf()
{
Console.WriteLine(
"222");
}
}
}

上面代码编译肯定是没问题的,但是运行时会报错--无法将类型为“Generic.Person”的对象强制转换为类型“Generic.ChinaPerson”。

 

而且Main函数中的第二行:ChinaPerson cp = (ChinaPerson)p;

如果改为ChinaPerson cp = p;编译不过.(这是肯定的了)

很明显,我理解的C#的编译和运行时规范是没问题的.那么像上面同样功能的java代码如果能很好的编译运行的话,难道说java和C#在这个基本问题上有了这么大的出入?不过我觉得这是不可能的.原因嘛--还用说吗,采用OOP的强类型语言不可能出现这种问题.

 

分析和结论:

1.最囧的可能是我当时听错了面试题目--面试官可能想问的是把子类对象转化给一个父类,如果父类调用方法的时候,调用的是子类的还是父类的.

但如果是这样的话,面试官应该就不需要特别强调[强行转化]了,所以这个分析不对.而且这个职位的待遇不低,不至于问这么浅显的问题

2.或许面试官就是故意问一个编译不过的问题,他想听到的答案就是我说编译不过.可惜,我当时没这么认为.

 

以上是问题的分析和结论,若有写的不对的地方欢迎博友们灌水解答.

posted on 2011-01-04 13:15  浓咖啡  阅读(1370)  评论(11编辑  收藏  举报

导航