TEL:400-8793-956
当前位置:程序、服务器

这段代码有什么问题

提问者: 近期获赞: 浏览人数: 发布时间:2021-03-08 10:50:04

 问:大家好,

 
展开| 选择| 包装| 行号
命名空间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的对象;它不会更改其运行时类型。
 
希望这可以帮助。
上一篇: 在不声明var prop的情况下,javascript如何知道它是对象的键?
下一篇: 将新记录添加到单个Excel工作表中的现有记录