如果我没有将方法标记为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 :(得分:2)
是的,因为派生类是基类的一种类型。
考虑一个哺乳动物课程。所有的哺乳动物都会呼吸,所以我们会有哺乳动物。呼吸()。现在考虑一个Cat类。由于猫是哺乳动物,我们将其从哺乳动物中获得,然后已经存在从哺乳动物继承的Cat.Breathe(),没有任何额外的工作(“无额外工作”位是OO的一个省时方面)。
如果Mammal.Breathe()是虚拟的,那么我们可以使其在Cat.Breathe()的情况下表现不同。如果它不是虚拟的,我们不能,尽管非虚方法可以调用虚方法,这会使其行为的一部分可以覆盖。
答案 1 :(得分:1)
如果我不使用虚拟方法,它是否可用于派生类?
是的,该方法可用于任何派生类,但您无法在派生类中重写此方法并更改其行为。在您的示例类中,B
拥有m1
方法,因为它派生自类A
,但由于该方法不是虚拟的,因此无法覆盖它。
事实上,您的示例甚至不会编译,因为您没有为 (经过@dtb编辑后,代码现在将编译)m1
方法指定返回类型。此外,通过不为方法指定access modifier,将假设private
,您甚至无法在派生类中调用基本方法(除非使用反射)。