| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4605 人关注过本帖
标题:关于override和new在孙子类里面调用祖父类方法差异的问题
取消只看楼主 加入收藏
cpxuvs
Rank: 3Rank: 3
等 级:论坛游侠
威 望:3
帖 子:45
专家分:142
注 册:2015-12-22
结帖率:85.71%
收藏
已结贴  问题点数:20 回复次数:1 
关于override和new在孙子类里面调用祖父类方法差异的问题
程序代码:
using System;
namespace foreachtest
{
    class program
    {
        public static void Main(string[] args)
        {
            A a=new A();
            B b=new B();
            A ab=new B();
            C c=new C();
//            a.afuc();
//            a.avfuc();
//            b.afuc();
//            b.avfuc();
//            ab.afuc();
//            ab.avfuc();
//            c.afuc();
            c.avfuc();
        }
    }
    class A
    {
        public void afuc()
        {
            Console.WriteLine("这是A的普通方法");
        }
        public virtual void avfuc()
        {
            Console.WriteLine("这是A的虚方法");
        }
    }
    class B:A
    {
        public new void afuc()
        {
            Console.WriteLine("这是B的普通方法");
        }
        public override void avfuc()
        {
//            base.avfuc();
            Console.WriteLine("这是B的虚方法");
        }
    }
    class C:B
    {
        public override void avfuc()
        {
            ((A)this).avfuc();//这里的问题
            Console.WriteLine("这是C的虚方法");
        }
        public new void afuc()
        {
            ((A)this).afuc();
            Console.WriteLine("这是c的普通方法");
        }
       

    }
}


这个程序编译通过了,但运行出错Process is terminated due to StackOverflowException.
我知道它有错,但是不是很了解原因

((A)this).avfuc()编译通过,说明了编译器的确将当前对象强制转换成了A类对象,但为什么运行时异常,是因为仍然使用的是c对象?类似多态?那new里面为什么是可以通过的?

望大神解释解释



















搜索更多相关主题的帖子: color 
2016-05-19 17:38
cpxuvs
Rank: 3Rank: 3
等 级:论坛游侠
威 望:3
帖 子:45
专家分:142
注 册:2015-12-22
收藏
得分:0 
回复 2楼 yhlvht
谢谢大神,明白了一些!
请问一下,这种因为调用虚函数,会查找override的过程,是不是只会在父类类型指向子类对象是才会这么去做?
还有就是,既然这样的强制转换不能真正改变对象的类型,那是不是一个对象一旦建立,它的类型(heap上的)就无法更改了?
虽然我觉得这样干没啥意义,但是想得到一个确定的答案。
2016-05-19 21:09
快速回复:关于override和new在孙子类里面调用祖父类方法差异的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.150112 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved