|
|
1
100
让我们先考虑一下插槽。有两个插槽。A的所有实例都需要有一个插槽,我们称之为getnamelota。C的所有实例都需要有一个我们称之为GetNameSlotC的插槽。这就是C语言声明中“new”的意思——它的意思是“我想要一个新槽”。与B中声明的“override”相比,B中声明的“override”意味着“我不想要新插槽,我想要重用getnamelota”。 当然,C继承自A,因此C还必须有一个插槽GetNameSlotA。因此,C的实例有两个插槽——GetNameSlotA和GetNameSlotC。非C的A或B实例有一个插槽GetNameSlotA。 现在,当您创建一个新的C时,这两个槽中会有什么?有三种方法,我们称之为GetNameA、GetNameB和GetNameC。
B的声明说“将GetNameB放在getnamelota中”。B是C的超类,所以B的规则适用于C的实例。现在a和B之间存在冲突。B是更派生的类型,所以它赢了——B的规则 覆盖 C的声明说“将GetNameC放在getnamelotc中”。 因此,您的新C将有两个插槽。GetNameSlotA将包含GetNameB,GetNameSlotC将包含GetNameC。 现在,我们已经确定了哪些方法位于哪些插槽中,所以我们回答了第一个问题。 现在我们必须回答第二个问题。这个插槽叫什么?
因此,这是对GetNameSlotA中的任何内容的调用。我们已经确定,在运行时,GetNameB将位于该插槽中。因此,这是对GetNameB的调用。 这里的关键是 |
|
2
24
它应该返回“B”,因为
|
|
|
3
3
很简单,您只需要记住继承树。 推翻 (请注意,只有“virtual”是覆盖,“new”是完全不同的…)。
类“C”中的“New”的意思正是:如果您对这种(确切的)类型的实例调用“GetName()”,那么请忘记一切并使用此方法相反,Virtual的意思是:无论调用实例的确切类型是什么,都要在继承树上找到具有此名称的方法。 |
|
|
4
2
好吧,这篇文章有点老了,但它是一个很好的问题和回答,所以我只想补充一下我的想法。 考虑下面的例子,它与以前相同,除了主要功能:
现在很明显,函数调用不能在编译时绑定到特定函数。然而,必须编译一些东西,这些信息只能取决于引用的类型。因此,除了C类型的引用之外,不可能使用任何引用来执行C类的GetName函数。 顺便说一句,也许我应该用method这个词来代替function,但正如莎士比亚所说:任何其他名称的函数仍然是一个函数:) |
|
|
5
-1
实际上,我认为它应该显示C,因为新操作符只是隐藏 全部的 具有相同名称的祖先方法。因此,在隐藏A和B方法的情况下,只有C仍然可见。 http://msdn.microsoft.com/en-us/library/51y09td4%28VS.71%29.aspx#vclrfnew_newmodifier |
|
Fernando Chu · 一个变量有多个可能的类?[关闭] 1 年前 |
|
|
Amaterastis · 基类接受子类和内部子类的模板参数 1 年前 |
|
|
Rishab Negi · 这个关键字在抽象类中是如何工作的 1 年前 |
|
|
dEmigOd · 类层次结构中的运算符重载解析 1 年前 |
|
|
TableTopRug · 如何从Kotlin中的密封类继承? 1 年前 |
|
|
hasdrubal · 抽象基类函数指针python 2 年前 |
|
|
Josh · 通过反思访问孩子的财产 2 年前 |