我有一个基类和派生类,基类有两个在派生类中重写的方法。我们采取以下方案:
我的基类
public class BaseClass
public Overridable function method1()
method2()
End Function
public Overridable function method2()
' Empty !!!
End Function
End class
My Derived class
public class DerivedClass
public Overrides function method1()
MyBase.method1()
End Function
public Overrides function method2()
' Some code !!
End Function
End class
现在我已经创建了一个派生类的实例并调用了method1()。
Dim obj as new DerivedClass()
obj.method1()
方法1()在派生调用method1()的基础中,它调用基类中的method2。对我来说奇怪的是,base2中的method2是空的,在派生中调用了method2! ..
任何人都可以向我解释发生了什么以及如何使用继承调用方法?这个层次结构应用了什么概念?
答案 0 :(得分:1)
基础中派生调用method1()的method1(),调用基础中的method2。
这是你错的地方。
由于method2是可覆盖的,因此它是一个虚拟方法"。因此,对method2的所有调用都会调用重写版本。这包括基类的method1中的method2调用:
Public Class BaseClass
Public Overridable function method1()
method2() ' <-- If method2 has been overridden, the overridden
' version is called here.
End Function
...
End Class
答案 1 :(得分:1)
VB中的可覆盖方法(如C#中的虚方法)不直接调用,但通常使用所谓的vtable,其中包含指向方法的指针。这样,当你有一个BaseClass类型的实例时,vtable将指向可覆盖方法的BaseClass版本。当你有一个DerivedClass实例时,指向该方法版本的指针会覆盖vtable中的内容,所以当调用该方法时,它将调用派生类的版本。有关vtable的更多信息,请参阅this question