2011-07-14 13 views
1

ここで私は、私は(C.fooを呼び出すときに見たいものをオーバーライド、オーバーライド機能

class A 
{ 
    virtual void foo(); 
} 

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

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

を実行しようとしていものだが) A.foo()、B.foo()、Cです。 foo()

しかし、私は仮想オーバーライドが同じ関数定義で使用できると思います。どうすればこの問題を回避できますか?明示的sealedを宣言しない限り、

おかげ -Mike

+3

「仮想」の誤解のようです。 – SLaks

答えて

5

オーバーライド機能は、自動的にvirtualです。 C.Foo手動base.Foo()を呼び出さない限りC.Foo()を呼び出すとB.Foo()またはA.Foo()を呼び出さないということ

注意。限りfooがアクセス可能であるよう

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

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

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

+0

ええ、私はごめんなさい、私はすべてを書き留めるために怠け者だと分かっています。 BとCの両方のfoo関数にbase.fooがあります。しかし、私はオーバーライドを呼び出す場合void foo(){base.foo(); }はB.foo()やA.foo()を呼び出すでしょうか? –

+0

'C'の基本クラスは' B'です。したがって、 'B.Foo'を呼び出します。 'B'が' base.Foo() 'を呼び出すと、それは' A.Foo'を呼び出します – SLaks

2

コードは次のように動作するはずです。 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(); 
関連する問題