派生类的中调用基类方法时 方法入口地址是否和基类调用时一致

wsdgqs 2008-11-24 08:37:12
也就是说 基类派生出多个子类时 各子类调用基类的方法时,是否调用的是内存中的同一段代码段,还是各自拥有一份拷贝?
C#能不能获得方法的入口地址?谢谢
...全文
235 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangping_li 2008-11-25
  • 打赏
  • 举报
回复
mark
wsdgqs 2008-11-25
  • 打赏
  • 举报
回复
嗯 ls说的很对
我这么问并不是实际工作中遇到的问题 仅仅是出于理解 因为我想了解
派生时究竟发生了什么?
也许要过些时间才能理解吧...我想了解高手们怎么理解的?即便未必是真相,只要向真相靠近一步 那也是进步了 :)
再等等 下班时结贴.谢谢各位.
Fibona 2008-11-25
  • 打赏
  • 举报
回复
上面打错了,


覆盖:定义跟基类同名,同参数的方法,就自动覆盖

隐藏:定义跟基类同名,同参数的方法,但是前面加个new关键字

class A
{
int Add(int x, int y)
{
return x + y;
}
}

class B:A
{
int Add(int x, int y)
{
return x + y - 100;
}
}

class C:A
{
new int Add(int x, int y)
{
return x + y - 100;
}
}
Fibona 2008-11-25
  • 打赏
  • 举报
回复

覆盖:定义跟基类同名,同参数的方法,就自动覆盖

隐藏:定义跟基类同名,同参数的方法,就自动覆盖
但是前面加个new关键字


class A
{
int Add(int x, int y)
{
return x+y;
}
}

class B
{
int Add(int x, int y)
{
return x+y-100;
}
}

//下面的C里面隐藏A的Add方法

class C{
new int Add(int x, int y)
{
return x+y-100;
}
}
  • 打赏
  • 举报
回复
.Net平台的优越处之一就是对编程人员透明了内存地址、指针。
不要在.Net中去刻意使用内存地址处理事务,因为那是绝对错误的做法。
如果你出于技术爱好,想研究一下,可以网上查查关键字:unsafe
c sharp中,只有在unsafe中,才能使用地址(指针)
wsdgqs 2008-11-25
  • 打赏
  • 举报
回复
顶...有点失望啊
abcyzq 2008-11-25
  • 打赏
  • 举报
回复
顶,学习来了。
wsdgqs 2008-11-25
  • 打赏
  • 举报
回复
编译时绑定是由编译器编译时确定方法的调用指向哪个代码段
运行时绑定是指编译后方法的调用指向的仍然是一个指针 该指针指向调用的代码段地址且是可变的?
这样理解对吗?
编译时绑定 和 运行时绑定 是怎样使得 new 和 override表现出不同的特性的?
wsdgqs 2008-11-25
  • 打赏
  • 举报
回复
这样的问题很难回答吗?还是我的理解有问题呢
我问这个问题主要是理解这句话
new是编译时绑定 override是运行时绑定
有人能解释一下吗 ?
啊兵 2008-11-25
  • 打赏
  • 举报
回复
只知道用,但是从来没有想过这个问题

估计是每调用一次会新建吧
wsdgqs 2008-11-25
  • 打赏
  • 举报
回复
谢谢...可是答案大多不是我想要的,覆盖隐藏这些我都很清楚,我想了解的是在内存中如何实现的?是不是如2楼所说,每一次派生都生成各自的一份拷贝?比如:
class A
{
int Add(int x, int y)
{
return x + y;
}
}

class B:A
{
}
B b=new B();A a=new A();
那么b.Add()和a.Add()执行的是内存中的同一段代码的两份拷贝(代码段内容完全一样),还是同一段代码?如何证实?所以我想知道能否获取方法的入口地址来验证一下.


wsdgqs 2008-11-25
  • 打赏
  • 举报
回复
结了算了 :( 还是要靠自己呀
whitechololate 2008-11-25
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 isline 的回复:]
.Net平台的优越处之一就是对编程人员透明了内存地址、指针。
不要在.Net中去刻意使用内存地址处理事务,因为那是绝对错误的做法。
如果你出于技术爱好,想研究一下,可以网上查查关键字:unsafe
c sharp中,只有在unsafe中,才能使用地址(指针)
[/Quote]

编译时绑定是由编译器编译时确定方法的调用指向哪个代码段
运行时绑定是指编译后方法的调用指向的仍然是一个指针 该指针指向调用的代码段地址且是可变的?
这样理解对吗?
编译时绑定 和 运行时绑定 是怎样使得 new 和 override表现出不同的特性的?

效率上有差异。
wsdgqs 2008-11-25
  • 打赏
  • 举报
回复
顶一下
wsdgqs 2008-11-24
  • 打赏
  • 举报
回复
洗洗睡了 明天起来看 :)
wsdgqs 2008-11-24
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 wuyq11 的回复:]
继承的处理从定义基类开始,基类定义了所有对于派生类来说普通的属性和方法,派生类从基类继承所需的属性和方法,且在派生类中增加新的属性和方法。
相同的函数名的函数,在基类和派生类中的关系只能是覆盖或者隐藏

[/Quote]
覆盖和隐藏如何实现?
culture9 2008-11-24
  • 打赏
  • 举报
回复
通过我的理解是调用同一段内存空间的代码。但说不出相应的理论来
wuyq11 2008-11-24
  • 打赏
  • 举报
回复
继承的处理从定义基类开始,基类定义了所有对于派生类来说普通的属性和方法,派生类从基类继承所需的属性和方法,且在派生类中增加新的属性和方法。
相同的函数名的函数,在基类和派生类中的关系只能是覆盖或者隐藏
wsdgqs 2008-11-24
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 mjjzg 的回复:]
类类型是引用类型(感觉有点绕口),所有指的是它的内存地址,及同一个代码段
System.Reflection.MethodBase.GetCurrentMethod().ReflectedType.Name.ToString();
System.Reflection.MethodBase.GetCurrentMethod().Name.ToString();
[/Quote]
我可能没有表达清楚
我想知道的是基类和派生类中方法的关系;而不是类的各个实例。不过仍然感谢回答。
wsdgqs 2008-11-24
  • 打赏
  • 举报
回复
@isline:
有什么办法可以获取方法的入口地址吗?
加载更多回复(2)

111,131

社区成员

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

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

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