C#虚方法问题

时间:2010-07-07 08:13:42

标签: c# virtual-method

有一件事我不太了解:调用虚方法时,也调用基本方法?

因为当我使用公共覆盖WinForm OnPaint方法时,在其body base.OnPaint(e)中被调用。我不明白,我认为虚拟方法会覆盖原始方法。 如果它通常不被调用,为什么在这种情况下调用它?谢谢

5 个答案:

答案 0 :(得分:11)

不,如果您没有从派生类中明确调用它,则不会调用它。

答案 1 :(得分:5)

  

当调用虚方法时,   还调用了基本方法?

没有

  

因为当我使用公共覆盖时   OnPaint(),在它的身体基础上.OnPaint(e)   叫做。我不明白,我   以为虚拟方法会覆盖   原来的。

开发人员选择调用base.OnPaint(e)并执行其他操作。换句话说,基础实现是你掌握的东西,以防它对你有用 - 你可以调用它,然后做一些额外的特定工作。

如果函数体只是 对基数的调用,那么它将等同于根本不写入覆盖函数。

答案 2 :(得分:1)

据我所知,当你说“调用虚方法”时,你的意思是重写方法。

答案是否定的。每当调用任何版本的虚方法时,它都不会自动调用其基类方法。但有时你想调用它们,所以你要包含对基类方法的显式调用。像这样:

class Base
{
  public virtual void VirtualMethod()
  {
    // Insert code here
  }
}

class Derived : Base
{
  public override void VirtualMethod()
  {
    // Insert code here
    base.VirtualMethod(); // Explicit call to the base class method
  }
}

如果我们没有包含指令base.VirtualMethod();,则在调用派生类方法时不会调用基类方法。

答案 3 :(得分:0)

  

当调用虚方法时,   还调用了基本方法?

这取决于您是否在重写方法中调用base.XXX

答案 4 :(得分:0)

有时你在“base”方法中有代码,无论正在执行哪个子方法都很有用,那么孩子们只能调用基本方法,但这是可选的。

除非你专门调用基本方法,否则调用子方法而不是“基础”,而不是“以及”。