2011-10-23 17 views
2

は、私は、これらのクラスがあります。ポリモーフィズムと継承

class A 
{ 
    public int Foo() 
    { 
     return 5; 
    } 
} 

class B : A 
{ 
    public int Foo() 
    { 
     return 1; 
    } 
} 

を、私はこのようにそれらを使用する:

 B b = new B(); 
     int x = b.Foo(); 

基底クラスではFoo()は、仮想、または派生ではありませんが、クラスにはoverrideキーワードがなく、まだxは1です。次に、virtualキーワードとoverrideキーワードの使い方は?

+2

あなたはどの言語を使用していますか? C#? Java? – CodesInChaos

+1

@ルチそれはC#、Javaではないようです。それは 'extended'ではなく': 'を持ち、' ​​virtual'/'override'キーワードについて話します。 Javaではなく、.netにも命名規則に従います。だから私はそれをC#でタグ付けするのが適切だと思います。 – CodesInChaos

+0

C#。 Javaは継承も知っているので、私はタグを付けなかった。 –

答えて

4

多型はB型が、これはC#のであると仮定すると、A型として

A b = new B(); 
int x = b.Foo(); // x will be 1 if virtual, 5 if not. 
0

あなたは、基本クラスのポインタまたは参照を介してメソッドを呼び出すと、この方法は、仮想製造の点である:この例で

A p = new B();
int x = p.Foo();

、Pの静的タイプはAであるが、ダイナミック型Bです。つまり、静的型はAですが、多型のためB.Fooが呼び出されます。

あなたはFooを上書きしませんでした:

+0

あなたは((A)b).Foo(); –

+0

質問はJavaに関するものです。 p-> Foo()はJavaでは終了しません。 –

+0

おっと、ごめんなさい - 私はC++を考えていました! – Dabbler

3

を扱うことができます。あなたは、ベースクラスのFooを隠しました。つまり、fooを静的型の変数であるBと呼び出すと、が返され、静的型A(実行時に型がBであっても)を呼び出すと、A.Foo()が返されます。

newキーワードを使用せずに基本メソッドを隠すので、コードでコンパイラの警告が表示されるはずです。あなたがFooをオーバーライドしていた場合

B b = new B(); 
int x = b.Foo();//calls B.Foo 
A a = b;//Runtime type B, compiletime type A 
a.Foo(); // calls A.Foo 

、あなたはどちらの場合でもB.Foo()を取得したいです。

1

virtualと表示すると、多型になります。これは派生クラスでオーバーライドできることを意味します。多相メソッドは、基底クラス参照から呼び出すと有効になります。実行時に呼び出されるメソッドは、基本クラス参照が指すオブジェクトの実行時クラスによって異なります。実行時の型が基本クラスそのものの場合、呼び出されるメソッドは基本クラスのメソッドになります。実行時の型がそのメソッドをオーバーライドした派生型の場合、呼び出されるメソッドはオーバーライドされたメソッドになります。

メソッドがvirtualでない場合は、実行時の型に関係なく、オブジェクトへのコンパイル時参照の型で宣言されているメソッドを呼び出すようにバインドされます。

1

あなたの宣言型はBです。したがって、宣言型がAで、Bの新しいインスタンスをインスタンス化する場合は、virtualキーワードを使用してポリモーフィズムをサポートしない限り、宣言型として5を取得します。 。