2

可能重复:
什么是虚拟方法?

在 C# 中,即使您不将基类方法声明为虚拟方法,编译器也会在方法签名匹配时调用最新的派生类方法。如果没有 virtual 关键字,我们只会收到警告消息,说明将调用派生方法(现在可以使用 new 关键字将其删除)。

如果没有 this 关键字,当签名匹配时调用最后一个派生类中的方法时,将方法声明为虚拟方法有什么用。

我不明白这里的东西。“虚拟”是为了代码可读性目的吗?史密斯

4

2 回答 2

6

这并不是关于“最新的派生方法”。这是关于当你使用多态性时会发生什么。virtual当您在预期父类的上下文中使用派生类的实例时,如果您不使用/ ,它将调用父类的方法override

例子:

class A
{
    public int GetFirstInt() { return 1; }
    public virtual int GetSecondInt() { return 2; }
}

class B : A
{
    public int GetFirstInt() { return 11; }
    public override int GetSecondInt() { return 12; }
}

A a = new A();
B b = new B();

int x = a.GetFirstInt(); // x == 1;
x = a.GetSecondInt();    // x == 2;
x = b.GetFirstInt();     // x == 11;
x = b.GetSecondInt();    // x == 12;

但有以下两种方法

public int GetFirstValue(A theA)
{
   return theA.GetFirstInt();
}

public int GetSecondValue(A theA)
{
   return theA.GetSecondInt();
}

有时候是这样的:

x = GetFirstValue(a);   // x == 1;
x = GetSecondValue(a);  // x == 2;
x = GetFirstValue(b);   // x == 1!!
x = GetSecondValue(b);  // x == 12
于 2012-10-02T06:50:28.477 回答
0

可以重新定义虚拟方法。在 C# 语言中,virtual 关键字指定可以在派生类中重写的方法。这使您能够添加新的派生类型,而无需修改程序的其余部分。因此,对象的运行时类型决定了你的程序做什么。

您可以查看详细示例

public class Base
{
  public int GetValue1()
  {
    return 1;
  }

  public virtual int GetValue2()
  {
    return 2;
  }
}

public class Derived : Base
{
  public int GetValue1()
  {
    return 11;
  }

  public override int GetValue2()
  {
     return 22;
   }
}

Base a = new A();
Base b = new B();

b.GetValue1();   // prints 1
b.GetValue2();   // prints 11 
于 2012-10-02T06:29:54.450 回答