![]() |
1
14
答案在C规范中。 section 7.3 和 section 7.5.5.1 我分解了用于选择要调用的方法的步骤。
最后胜利者是
如果抽象方法从C中移除
如果从C中移除抽象方法,则初始集为
在这种情况下,获胜者是
|
![]() |
2
9
正如其他人所指出的,编译器这样做是因为 语言规范就是这么说的。 这可能是一个令人不满意的答案。一个自然的后续行动将是“在决定以这种方式指定语言的基础上,设计原则是什么?” 在stackoverflow和我的邮箱中,这是一个常见的问题。简单的答案是“这种设计减轻了脆弱的基础类bug家族。” 有关该功能及其设计方式的说明,请参阅我关于主题的文章: http://blogs.msdn.com/b/ericlippert/archive/2007/09/04/future-breaking-changes-part-three.aspx 有关各种语言如何处理脆弱的基类问题的更多文章,请参阅我关于该主题的文章存档: http://blogs.msdn.com/b/ericlippert/archive/tags/brittle+base+classes/ 这是我上周的同一个问题的答案,看起来非常像这个问题。 Why are signatures declared in the base class ignored? 下面还有三个相关或重复的问题: Method overloads resolution and Jon Skeet's Brain Teasers Why does this work? Method overloading + method overriding + polymorphism |
![]() |
3
1
我认为这是因为在非虚方法的情况下,使用调用方法的变量的编译时类型。 您有一个非虚拟的foo方法,因此调用了该方法。 这个链接有很好的解释 http://msdn.microsoft.com/en-us/library/aa645767%28VS.71%29.aspx |
![]() |
4
1
所以,这就是它的工作原理 according to the specification (在编译时,考虑到我正确地导航了文档):
编译器从类型中标识匹配方法的列表
在此列表中,将排除包含重写修饰符的任何声明。这意味着列表现在包含以下方法:
现在我们有了匹配的候选对象列表,编译器现在决定调用什么。在文件中 7.5.5.1 Method invocations ,我们找到以下文本:
这实质上意味着,如果在
|
![]() |
5
0
我认为,当实现另一个类时,它会在树的最上面查找方法的可靠实现。因为没有调用方法,所以它正在使用基类。
我想我在.net上不是职业选手 |