我对virtual/ new/ override事情有点困惑.这是一个例子:
class A
{
public virtual void mVVirtual() { Console.WriteLine("A::mVVirtual"); }
}
class B : A
{
public virtual void mVVirtual() { Console.WriteLine("B::mVVirtual"); }
}
class C : B
{
public override void mVVirtual() { Console.WriteLine("C::mVVirtual"); }
}
class Test
{
static void Main()
{
B b1 = new C();
b1.mVVirtual(); //C::mVVirtual ... I understand this
A a2 = new C();
a2.mVVirtual(); //A::mVVirtual ... ???
}
}
Run Code Online (Sandbox Code Playgroud)
我不明白为什么在第二次通话中我们得到了A::mVVirtual.我通常用这个"算法"处理这些问题:
mVVirtual?没有一个......但确实有一个带有该签名和名称的虚拟方法!我不理解这个程序的输出:
#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
int i = 0;
int main()
{
while(i<3)
{
fork();
printf("%d\n",i);
++i;
}
}
Run Code Online (Sandbox Code Playgroud)
输出是:
0
1
2
2
1
2
0
1
2
2
2
1
2
2
Run Code Online (Sandbox Code Playgroud)
有人可以告诉我如何解决这个问题,以便完全理解为什么我得到这个输出?
昨天我发布了一个关于new/virtual/override关键字的问题,我从你的答案中学到了很多东西.但我仍有一些疑虑.
在所有"盒子"之间,我与类型的方法表中真正发生的事情失去联系.例如:
interface I1 { void Draw(); }
interface I2 { void Draw(); }
class A : I1, I2
{
public void Minstance() { Console.WriteLine("A::MInstance"); }
public virtual void Draw() { Console.WriteLine("A::Draw"); }
void I2.Draw() { Console.WriteLine("A::I2.Draw"); }
}
class B : A, I1, I2
{
public new virtual void Draw() { Console.WriteLine("B::Draw"); }
void I1.Draw() { Console.WriteLine("B::I1.Draw"); }
}
class Test
{
public static void Main()
{
A a = new B();
a.Draw();
I1 i1 = new A();
i1.Draw(); …Run Code Online (Sandbox Code Playgroud) c# ×2
new-operator ×2
overriding ×2
virtual ×2
c ×1
fork ×1
interface ×1
keyword ×1
process ×1