2010-10-02 78 views
1

如果我没有将方法标记为virtual,它是否可用于派生类?做超类和子类对象共享常用方法吗?

如果使用对象a,我更改基类的方法。然后对象b访问基类(可用于派生类)的相同方法m1()

它会按对象a打印那些更改的值吗?

他们会有共同的方法吗?

class A 
{ 
    public int m(int i) 
    { 
     return i * i; 
    } 
} 

class B : A 
{ 
} 

class C 
{ 
    static void Main() 
    { 
     A a = new A(); 
     int x = a.m(2); // returns 4 

     B b = new B(); 
     int y = b.m(4); // 16 
    } 
} 
+0

你在调试代码时看到了什么? – 2010-10-02 14:11:53

回答

2

是的,因为派生类是基类的一种类型。

考虑一个哺乳动物类。所有的哺乳动物呼吸,所以我们会拥有Mammal.Breathe()。现在考虑一个Cat类。由于猫是哺乳动物,所以我们可以从哺乳动物得到这个,然后已经有一个从Mammal继承的Cat.Breathe(),没有任何额外的工作(“没有额外的工作”是OO的一个节省时间的方面)。

如果Mammal.Breathe()是虚拟的,那么我们可以使它在Cat.Breathe()的情况下表现不同。如果它不是虚拟的,我们不能,虽然非虚拟方法可以调用虚拟方法,这会使其行为的一部分被覆盖。

+0

我明白了,先生,你的解释总是很有用........我的上述程序是正确的先生?我也想知道如果使用对象“b”我做了超类的方法的一些改变,然后我做了一个类的新对象,那么如果我调用超类的对象“a”的方法已经被改变使用基类对象然后a.m1()将得到该更改的方法 – NoviceToDotNet 2010-10-02 14:31:24

+0

不看语法..我想学习概念 – NoviceToDotNet 2010-10-02 14:35:45

+0

我们回到了隐藏和重新骑马之间的差异。我建议您尝试各种可能性,并在调试器中逐个执行代码。这里和你的其他问题的解释已经涵盖了相关理论,你需要对实际发生的事情有一个感觉*。 – 2010-10-02 14:40:05

1

如果我不使用虚拟的方法,将它提供给派生类?

是的,该方法将可用于任何派生类,但您将无法在派生类中重写此方法并更改其行为。在您的示例类B拥有m1方法,因为它来自类A但不能覆盖它,因为该方法不是虚拟的。

事实上,您的示例甚至不会编译,因为您没有为 m1方法指定返回类型。此外,如果未指定方法 access modifier,则会假定为 private,您甚至无法在派生类中调用基本方法(除非使用反射)。 (在通过@dtb编辑之后,代码将立即编译)