2011-07-14 94 views
1

這裏就是我想要做的重寫,重寫功能

class A 
{ 
    virtual void foo(); 
} 

class B : A 
{ 
    virtual override void foo(); 
} 

class C : B 
{ 
    override void foo(); 
} 

所以我想看看調用C.foo(當)是 A.foo(),B.foo(),C。 foo()

但我不認爲虛擬覆蓋可以在相同的函數定義中使用。我將如何解決這個問題?

感謝 -Mike

+3

你似乎誤解了'虛擬'。 – SLaks

回答

5

重寫功能自動virtual,除非明確聲明sealed

請注意,調用C.Foo()不會叫B.Foo()A.Foo()除非C.Foo手動調用base.Foo()

+0

是的我明白我很抱歉,我懶得寫出一切。在B和C foo函數中都有一個base.foo。但如果我調用override void foo(){base.foo(); }在C會調用B.foo()或A.foo()? –

+0

C的基類是'B'。因此,它會調用B.Foo。如果'B'調用'base.Foo()',那麼將會調用'A.Foo' – SLaks

2

代碼應該像這樣工作:

public class A 
{ 
    public virtual void foo() {} 
} 

public class B : A 
{ 
    public override void foo() {} 
} 

class C : B 
{ 
    public override void foo() {} 
} 

只要foo是訪問。不需要'虛擬'B

0

這是你在找什麼?

class A 
    { 
     public virtual void foo() 
     { 
      MessageBox.Show("A"); 
     } 
    } 

    class B : A 
    { 
     public override void foo() 
     { 
      MessageBox.Show("B"); 
      base.foo(); 
     } 
    } 

    class C : B 
    { 
     public override void foo() 
     { 
      MessageBox.Show("C"); 
      base.foo(); 
     } 
    } 


C c = new C(); 
c.foo();