3

私がこのようなものを持っている場合:

class Base
{
    public void Write()
    {
     if (this is Derived)
      {
         this.Name();//calls Name Method of Base class i.e. prints Base
        ((Derived)this).Name();//calls Derived Method i.e prints Derived 
      }
     else
      {
        this.Name();
      }
    }

    public void Name()
    {
        return "Base";
    }
}

class Derived : Base
{
    public new void Name()
    {
        return "Derived";
    }
}

次のコードを使用して呼び出します。

Derived v= new Derived();
v.Write(); // prints Base

次に、Name基本クラスのメソッドが呼び出されます。しかし、メソッドthis内のキーワードの実際のタイプは何でしょうか? WriteそれがDerivedタイプである場合(プログラムコントロールがメソッドの最初のifブロックに入るためWrite)、それは基本Nameメソッドを呼び出しています.なぜ明示的なキャストは派生クラス(Derived)thisのメソッドへの呼び出しを変更するのですか?Name

4

4 に答える 4

7

this常に派生クラス型になります。

this.Name();呼び出しで基本クラスのName()メソッドを呼び出す理由は、仮想メソッドとして定義されていないためです。したがって、コンパイラがこの時点でNameの実際の型について何も知らないときに、コンパイル時にリンクされています。this

上記のコードに関して、もう 1 つ注意事項があります。一般に、製品コードでは、基本クラスから派生クラスを明示的に参照することは、基本クラスがそれを継承するクラスについて認識してはならないという OOP 原則の 1 つを破るため、実際には悪い習慣です。ただし、上記のコードが C++ の調査に使用されただけであると仮定すると、これはもちろん問題ありません。

于 2015-04-24T22:05:30.657 に答える
2

派生クラスでオーバーライドされたメンバーにアクセスする場合は、virtual と override を使用する必要があります。

class Base
{
    public void Write()
    {
     if (this is Derived)
      {
         this.Name();//calls Name Method of Base class i.e. prints Base
        ((Derived)this).Name();//calls Derived Method i.e prints Derived 
      }
     else
      {
        this.Name();
      }
    }

    public virtual void Name()
    {
        return "Base";
    }
}

class Derived : Base
{
    public override void Name()
    {
        return "Derived";
    }
}
于 2015-04-24T22:05:32.263 に答える