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()方法得到的是父类方法怎样解释。 展开
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()方法得到的是父类方法怎样解释。 展开
5个回答
展开全部
第1和3在内存中肯定一样的,这个和C++一样,只是多态而已。关于非虚方法覆盖,其实是省略了new关键字,“关键字new和override的区别:new修饰的方法表示显式隐藏基类继承的同名方法,不能够用基类的引用访问派生类的new方法;override表示重写基类的虚方法,可以用基类的引用指向派生类的重写方法。”
C#是托管的,动态跟踪不好跟踪,不过你可以用ILDasm在CLR语言机的角度考虑问题
C#是托管的,动态跟踪不好跟踪,不过你可以用ILDasm在CLR语言机的角度考虑问题
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
内存,堆栈?c++的东西这是,有的时候从c#的角度来考虑,不要管c++的指针内存,因为c#不存在指针问题,处理c#对内存的考虑没有c++那么复杂,所以理解类不用考虑这些的。
效果不一样,这里倒和c++是相同的
效果不一样,这里倒和c++是相同的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
在这两个类中不管是哪个类 每New 一次 就会在内存中新开辟一个空间 在堆里面存这个对象 在栈区里面就会有一个地址指向 该对象 所以每New 一次 你所的到的对象都是不同的 虽然 每个对象所执行的方法都一样
至于 你所new的对象 有哪些方法 得看你具体实现了哪些接口的方法 以及继承了哪些类...
我的回答就是这样
至于 你所new的对象 有哪些方法 得看你具体实现了哪些接口的方法 以及继承了哪些类...
我的回答就是这样
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
呵呵
看看引用类型 和实例类型你就明白了
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
重载时,根据参数选择调用的方法;
重写时,访问父类子类皆调用子类的重写方法;
隐藏时,访问父类则调用父类的方法,子类子类的方法。
看看引用类型 和实例类型你就明白了
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
重载时,根据参数选择调用的方法;
重写时,访问父类子类皆调用子类的重写方法;
隐藏时,访问父类则调用父类的方法,子类子类的方法。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询