问:大家好,
展开| 选择| 包装| 行号
命名空间ConsoleApplication1
{
第一课
{
公共无效PrintIt()
{
PrintOne();
((I)此).PrintOne();
}
公共虚拟无效PrintOne()
{
Console.WriteLine(“我来自基地。\ n”);
}
}
G类:我
{
公共重写void PrintOne()
{
Console.WriteLine(“我来自sub。\ n”);
}
}
班级计划
{
静态void Main(string [] args)
{
G g =新的G();
g.PrintIt();
Console.ReadLine();
}
}
}
我期望输出是
“我来自子”
“我来自基础”,
但输出不会到....我在哪里弄错?
我知道我可以通过在子类中调用base.PrintOne来实现这一点……但是我不希望那样。
我希望从基地本身调用它。
请给出意见。
答:这不可能。我的意思是,在强制转换您的I对象之后,该对象仍被实例化为G,因此他将从G获得PrintOne()方法,因为I是虚拟的,这意味着在此处进行了说明。 com / en-us / libr ... = vs.71%29.aspx
“调用虚拟方法时,将检查对象的运行时类型中的重写成员。在派生最多的类中,重写成员是如果没有派生类重写该成员,则可能是原始成员。”
所以,你的Google+甚至铸造仍将指向一个G和被调用我的虚拟方法时,你的对象的运行时类型为G.因此,这将从G.调用PrintOne()
底线是,当你的实例使用new G()作为G的对象;它不会更改其运行时类型。
希望这可以帮助。