| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 567 人关注过本帖
标题:不解 。。。 能帮忙的进来看看ThankYou
只看楼主 加入收藏
wangnannan
Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18
等 级:贵宾
威 望:87
帖 子:2546
专家分:9359
注 册:2007-11-3
结帖率:80.91%
收藏
 问题点数:0 回复次数:3 
不解 。。。 能帮忙的进来看看ThankYou
刚刚看了遮天兄的帖子 这是原来帖子的内容
程序代码:
using System;
public class FatherClass//定义基类
{
    public void N()//基类的非虚方法
    {
        Console.WriteLine("调用基类的非虚方法N");
    }
    public virtual void V()//基类的虚方法
    {
        Console.WriteLine("调用基类的虚方法V");
    }
}
public class SonClass : FatherClass//定义派生类
{
    public new void N()//new关键字讲覆盖基类的同名方法N()
    {
        Console.WriteLine("调用派生类的非虚方法N");
    }
    public override void V()
    {
        Console.WriteLine("调用派生类的虚方法V");
    }
}
public class App//应用类
{
    public static void Main()
    {
        FatherClass fc=new FatherClass();//基类对象
        SonClass sc = new SonClass();//派生类对象
        fc=sc;//怎么这句加了跟没加是一样的啊??????????????
        fc.N();//调用基类的N()方法
        sc.N();//由于有new关键字修饰N()方法,所以本处调用的的是派生类的N()方法
        fc.V();
        sc.V();
        Console.ReadKey();
    }
}
书上解释fc=sc只这样的:在运行时先fc=sc,所以调用的对象是fc现在实际所属类sc的方法,而不是fc被定义类的方法(红色部分不是很理解),如果这样的话怎么第一个输出的结果是“调用基类的非虚方法N呢”接着又说,程序中的对非虚方法的调用是在编译时已经确定了的,所以fc.N()sc,N()调用的是基类中的非虚方法N()。如果是这样的话,岂不是那个赋值语句 fc=sc没起到什么作用吗?百度了半天还是想不通?请前辈们指教 

其中一段代码         
        FatherClass fc=new FatherClass();//基类对象
        SonClass sc = new SonClass();//派生类对象
        fc=sc;//怎么这句加了跟没加是一样的啊??????????????
俺是这样的理解的
程序代码:
程序代码:
  fc=sc;//怎么这句加了跟没加是一样的啊??????????????

是有区别的
程序代码:
FatherClass fc=new FatherClass();//基类对象
SonClass sc = new SonClass();//派生类对象
fc=sc

这一句俺是这样理解的 虽然声明的对象是基类对象,但实际的内存空间是子类对象的。
如果不注释该行代码
程序代码:
public new void N()//new关键字讲覆盖基类的同名方法N()
    {
        Console.WriteLine("调用派生类的非虚方法N");
    }

new  用于隐藏基类成员的继承成员。
实际上子类的N()已经被隐藏了 所以fc.N() 只会调用基类的N() sc.N();子类只会调用自己的方法
fc.V(); 注释fc=sc 不同的地方在于这里 如果不注释 就像先头所说的 虽然声明的对象是基类对象,但实际的内存空间是子类对象的 所以只会调用派生类的虚方法 当然也可以理解为子类重写基类虚方法 试着将子类 v()的override去掉 发现还是执行基类的v() 【MSDN有这样的解释 如果没有派生类重写该成员,则它可能是原始成员 】
这点俺就有点疑惑了 既然实际的内存空间是子类对象的 那原始成员又是哪里来的呢? 如果按子类重写基类虚方法来理解 一切就顺理成章了
如果不注释 很显然 则会变成调用基类的虚方法

俺的理解是 虽然声明的对象是基类对象,但实际的内存空间是子类对象的。
这样理解对么? 可是原始成员就很难解释清楚了 疑惑

搜索更多相关主题的帖子: ThankYou 
2010-12-18 16:31
冰镇柠檬汁儿
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:北京
等 级:版主
威 望:120
帖 子:8078
专家分:6657
注 册:2005-11-7
收藏
得分:0 
我觉得所有问题的根源在于:FatherClass fc
FatherClass fc = new SonClass();这样又会是什么样子呢?
具体的我也说不清楚,类的这些关系太绕了。

本来无一物,何处惹尘埃
It is empty at all here, Why pm 2.5 is so TMD high!
2010-12-19 18:50
yms123
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:209
帖 子:12488
专家分:19042
注 册:2004-7-17
收藏
得分:0 
        fc=sc;//这句之后fc应该是变成了SonClass类型
        fc.N();//这点很奇怪会调用fc的方法N,不过fc毕竟是FatherClass可能调用时是调用不到子类的方法N因为子类方法加了new关键字,变成了子类独有。
        sc.N();//由于有new关键字修饰N()方法,所以本处调用的的是派生类的N()方法
        fc.V();//未加new关键字就会调用派生类的方法V
        sc.V();
        Console.ReadKey();
2010-12-20 14:51
apull
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:三体星系
等 级:版主
威 望:216
帖 子:1512
专家分:9259
注 册:2010-3-16
收藏
得分:0 
fc=(FatherClass)sc;
试试这个。
2010-12-22 13:23
快速回复:不解 。。。 能帮忙的进来看看ThankYou
数据加载中...
 
   



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

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