c#中父类引用指向子类对象问题

父类:publicclassA{.......;}子类(B继承于A):publicclassB:A{........;}那么运行Aab=newB();和运行Aab=new... 父类:

public class A
{
.......;
}

子类(B继承于A):

public class B:A
{
........;
}
那么运行A ab=new B();
和运行A ab=new A(); B b=new B(); ab=b;是不是效果一样,更重要的我想知道他们这两种方式在内存有区别吗?如果说第一种,其是以A类型在内存中创建B对象实例,那么在内存中是怎样的存在。。。还有就是假如父类有个非虚C()方法,在子类中重写了。new B()这个C()方法和父类中的C()地址覆盖了吧,可是这里ab.C()却取的是父类的方法。这个在内存中怎样解释。哪位大虾帮帮忙,我很晕,帮帮忙从内存的堆和栈解释一下。。跪谢了。
你说的我明白,C#不存在那些问题,可是不知道内存的问题,我总感觉自己理解就像不透彻一样。就像C#的引用类型,上面的那句代码,我就非常想知道ab=b中,ab得到的是b的地址还是什么其他的,在内存中这句是怎样变换的,假如ab得到的是b的地址,取ab.C()方法得到的是父类方法怎样解释。
展开
 我来答
yinhao110qq
2009-09-10 · TA获得超过115个赞
知道答主
回答量:122
采纳率:0%
帮助的人:68.6万
展开全部
内存分配肯定不一样啦呀~~·
A an=new B();说明:在A堆里面站了一个地址,然后在栈里面存值~这个值是实例化new B()的值~
B b=new B();说明 在栈里面直接开辟了一个b的空间!然后堆里面有b的地址来指向直接开辟的空间!
旁笑槐NH
2009-09-10 · TA获得超过2545个赞
知道大有可为答主
回答量:2686
采纳率:0%
帮助的人:2877万
展开全部
第1和3在内存中肯定一样的,这个和C++一样,只是多态而已。关于非虚方法覆盖,其实是省略了new关键字,“关键字new和override的区别:new修饰的方法表示显式隐藏基类继承的同名方法,不能够用基类的引用访问派生类的new方法;override表示重写基类的虚方法,可以用基类的引用指向派生类的重写方法。”
C#是托管的,动态跟踪不好跟踪,不过你可以用ILDasm在CLR语言机的角度考虑问题
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
江小右
2009-09-10 · TA获得超过6928个赞
知道小有建树答主
回答量:1195
采纳率:0%
帮助的人:825万
展开全部
内存,堆栈?c++的东西这是,有的时候从c#的角度来考虑,不要管c++的指针内存,因为c#不存在指针问题,处理c#对内存的考虑没有c++那么复杂,所以理解类不用考虑这些的。
效果不一样,这里倒和c++是相同的
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友b46358a
2009-09-10
知道答主
回答量:14
采纳率:0%
帮助的人:8.1万
展开全部
在这两个类中不管是哪个类 每New 一次 就会在内存中新开辟一个空间 在堆里面存这个对象 在栈区里面就会有一个地址指向 该对象 所以每New 一次 你所的到的对象都是不同的 虽然 每个对象所执行的方法都一样
至于 你所new的对象 有哪些方法 得看你具体实现了哪些接口的方法 以及继承了哪些类...
我的回答就是这样
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
来元彤8O
2009-09-10 · TA获得超过1451个赞
知道小有建树答主
回答量:759
采纳率:0%
帮助的人:255万
展开全部
呵呵
看看引用类型 和实例类型你就明白了
C#中如果存在方法重载,会根据其refrence type(引用类型)来调用对象的方法,而不是根据instance type(实例类型)来调用。
/*重载,覆盖,隐藏之间的区别
*
重载(overload)用于同一类中的成员函数,其特征为:
* 1)在同一类中
* 2)相同的函数名
* 3)参数不同(包括参数类型不同,或参数个数不同,或两者都不同,注意:和返回值没关系)
* 4)和是否虚函数无关
覆盖(override)是指派生类函数覆盖基类函数,其特征为:
* 1)不同的范围(分别位于派生类与基类)
* 2)相同的函数名称
* 3)参数相同
* 4)基类函数必须是虚函数
隐藏(hide)是指派生类的函数屏蔽了与其同名的基类函数,其特征为:
* 1)不同的范围(分别位于派生类与基类)
* 2)相同的函数名
(3)若参数不同,基类函数无virtual关键字,基类函数将会被隐藏。(因为派生类和基类不在同一范围,所以是隐藏而不是重载);
()若参数不同,基类函数有virtual关键字。基类函数将会被隐藏。(因为派生类和基类不在同一范围,所以是隐藏而不是重载;因为参数不同,所以是隐藏而不是覆盖);
()若参数相同,基类函数无virtual关键字。基类函数将会被隐藏。(因为基类函数不是虚函数,所以是隐藏而不是覆盖)。
()若参数相同,基类函数有virtual关键字。如果基类函数有多个重载版本,且派生类并没有重写所有的同名虚函数,当在派生类中调用函数时,基类中未被重写的虚函数将被隐藏。(当然,被重写的函数就是覆盖了)。

你看看这个http://hi.baidu.com/kxw102/blog/item/abc3fb34e78d0682a71e121b.html

重载时,根据参数选择调用的方法;
重写时,访问父类子类皆调用子类的重写方法;
隐藏时,访问父类则调用父类的方法,子类子类的方法。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式