我遇到一个有趣的问题!!大家进来看看!!尼玛????

hmw145 2012-08-06 12:24:59
如果看完问题你想这样回答:
1.首先是检查父有没有这样的方法然后才会检查子类有没有怎样的方法。那你就不用留言了!!
2.如果你竟然在回答我栈和堆是怎么样一回事的,那你也不用留言了!!因为栈和堆我懂!!
3.如果你刚写完代码的和心里有问题的哪你也不用留言了,因为你累了!!

以下我的问题:
...全文
3152 77 打赏 收藏 转发到动态 举报
写回复
用AI写文章
77 条回复
切换为时间正序
请发表友善的回复…
发表回复
一羽清宁 2012-08-20
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

当然是调用person.go方法,这和是堆和栈没什么关系,和编译器有关系,编译器可以决定如何调用go方法,如果go是virtual/override方法,那么编译器会这样调用go,到p引用的对象也就是china对象中查询签名为go的方法然后调用它,

如果go不是virtual/override方法,那么编译器根本不会去查询p引用什么对象,直接就调用person.go方法,编译器知道如何调用……
[/Quote]赞同,自己编码验证了一下。
zhoucong1020 2012-08-18
  • 打赏
  • 举报
回复
如果没有父类方法没有标记为abstract或者virtual,子类如果有同名方法,那么你再编译的时候没有注意到编译器给出的警告吗?子类方法隐藏了父类方法,如果是刻意隐藏请使用关键字new
楼主这种用法根本不是重载,而是隐藏,重载只能对abstract或者virtual方法
idd3514276 2012-08-17
  • 打赏
  • 举报
回复
自己也有些浮躁了,谢谢各位前辈给出的宝贵意见
Journey31 2012-08-17
  • 打赏
  • 举报
回复
樓主真是太狂了啊!MVP都沒你屌
wwtmw 2012-08-16
  • 打赏
  • 举报
回复
入门问题
初学的人能谦虚一点吗
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
那么多感叹号, 还提醒不用留言什么的。


没有学过编译原理/操作系统原理/windows内核解析/深入.net.... 只懂些 .net 的皮毛的人, 最容易自大...

多年前,搞c++,有个必读的《深度探索C++对象模型》...读完这些,再过来学.net,就轻松了...

如果LZ读的是C++,也就不会那么浮躁,那么霸道了。(.net,微软降低了程序员的门槛: 半个月,就能让……
[/Quote]

您说的话让我感很惭愧,的确,我太容易满足了
ShoulderLai 2012-08-15
  • 打赏
  • 举报
回复
我不懂数据结构,不懂计算机组成,不懂堆栈等等基础。我只懂一点面向对象的基础。
Person p=new China();如此实例化,的确是p对象引用子类China对象;
那么在China类的构造函数里有隐含的无参构造函数
public China():base()
{

}
先有父类,才会有子类。所以在new China()这块堆内存里,其实也是有Person对象被实例化了。
也就是说同一块里既有China对象,也有Person对象。为了区分调用谁,所以也就有了new,virtual这些东西出来了。
xiaoxia6liu 2012-08-15
  • 打赏
  • 举报
回复
……继承和多态都没搞清楚……我都不知道你是怎么面向对象的……
liunanxuan613 2012-08-15
  • 打赏
  • 举报
回复
c#--应该是c shape,[Quote=引用 56 楼 的回复:]

C#不喜欢学java玩虚的就虚的。。。一般情况覆盖就覆盖。。。不覆盖就不覆盖需要用关键字指明的。。。
还有就是我用的VS2010就没有你说的问题啊!!难道楼主CPU坏了?上图C# code
class Program
{
static void Main(string[] args)
{
Person p = new stu(……
[/Quote]
liunanxuan613 2012-08-15
  • 打赏
  • 举报
回复
java和c++的继承机制应该是一样的,当子类继承父类时,如果有同名的方法(没有virtual关键字),子类是直接覆盖父类的同名方法的。c#的话,没有直接覆盖,而是直接隐藏了父类的同名方法(若同名方法没有virtual关键字)。所以c++是china.go。[Quote=引用 45 楼 的回复:]

不懂,我德C++ 一直是china.go的
[/Quote]
潇雨歇 2012-08-14
  • 打赏
  • 举报
回复
说说我的看法。这和编译什么什么的没关系吧,他就是个运行时问题。.net会在第一次编译的时候会编译成CLR的中间码,运行时经过JIT的即时编译为本地机器吗,并可根据具体的系统/CPU什么的进行编译优化。.net本身是依赖元数据,所以编译期间不一定能真正的确定对象的类型(如泛型),所以也不能确定具体是哪个方法。只有在运行时才能真正的确定类型,并确定调用方法的地址。举个例子,工厂模式中有一种是通过Reflection创建出指定的对象,并返回指定的接口,并寻址方法地址。

很久没看书了,不知道对不对。好像没回答楼主的问题,楼主的问题应该是说运行时.net如何寻址吧。现在手上没具体的手册,不能精确回答。
eRenChina 2012-08-14
  • 打赏
  • 举报
回复
你子类能用父类实例化?
好尴尬啊 2012-08-13
  • 打赏
  • 举报
回复
楼主出来啊 不是很牛气嘛
wluomu 2012-08-13
  • 打赏
  • 举报
回复
这个问题是多态里面的问题,还是自己多写一些代码实验一下,另外这个问题并不难,所以口气不要那么大。
凤凰涅檠 2012-08-13
  • 打赏
  • 举报
回复
走三步,退一步,MARK
bobo5421 2012-08-12
  • 打赏
  • 举报
回复
这不就是多态和动态绑定嘛
  • 打赏
  • 举报
回复
[Quote=引用 44 楼 的回复:]

引用 42 楼 的回复:
java默认成员函数都是虚函数,而c#默认成员函数为非虚函数
C# new

C# code

public class ClassA
{
public void A(){}
}
public class DeriveclassA:ClassA
{
public new void A() {}
……

应该是分版本吧,以前需要显示的@ov……
[/Quote]
@override不影响,只是个annotation
指尖微凉丨 2012-08-11
  • 打赏
  • 举报
回复
这个是Visual Studio 2012 RC版
[Quote=引用 60 楼 的回复:]

这是个什么版本的VS?引用 18 楼 的回复:
[/Quote]
fxx3344 2012-08-11
  • 打赏
  • 举报
回复
[Quote=引用 53 楼 的回复:]

楼主似乎是关心内存以及调用方面的,其实没必要,每个编译器,每门语言都可以由自己的处理方式,大致上可能是这样的
[/Quote]
+1 ,我也认为lz可能是在问.net内部机制的问题,而非语言概念上的问题

以下这部分是对古老的面向对象编译器而已的,大家别忙着往.net套
面向对象编译器会把类的方法生成指令块,其所有实例都使用这段指令快处理方法调用;而对实例而言,保存的仅仅是数据而已。
lz的问题中没有override的使用,编译器发现p被声明成Person类型,于是实例p被简单映射到了Person对应的指令块(方法),执行的结果会以Person的方法定义为准。
使用override的方法处理就复杂多了,编译会从p的实际类型(而不是声明的类型)出发,按照继承树查找正确的指令块(方法),然后做映射。

.net的处理机制,我说不太清楚,但可以确认的一点是,指令块的映射不是在编译时做的,人家有clr;你编译出来的压根就不是二进制代码。
hcbzd 2012-08-11
  • 打赏
  • 举报
回复
这是个什么版本的VS?[Quote=引用 18 楼 的回复:]

[/Quote]
加载更多回复(42)

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧