派生类的实例在base中调用empty方法

时间:2017-05-10 12:00:58

标签: vb.net oop

我有一个基类和派生类,基类有两个在派生类中重写的方法。我们采取以下方案:

我的基类

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! ..

任何人都可以向我解释发生了什么以及如何使用继承调用方法?这个层次结构应用了什么概念?

2 个答案:

答案 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