2

プログラムのコード - 2 つのクラス、B は A から継承、TypeH() はクラスの文字を投稿します。

class Program
{
    static void Main(string[] args)
    {
        A z = new A();
        A x = new B();
        B y = (B)x;

        z.TypeH();
        x.TypeH();
        y.TypeH();

        x = (A)y;
        x.TypeH();
    }
}
class A
{
    public virtual void TypeH()
    {
        Console.WriteLine("A");
    }
}
class B : A
{
    public override void TypeH()
    {
        Console.WriteLine("B");
    }
}    

出力: ABBB なぜ最後の出力は A ではなく B なのですか?

4

4 に答える 4

2

これをポリモーフィズムと呼びます。B型参照 ( ) ではなく、インスタンス ( ) が重​​要Aです。

于 2012-05-02T10:15:59.837 に答える
2

仮想メソッドを呼び出す場合、メソッド呼び出しに使用されるコンパイル時の型ではなく、オブジェクトの実際のインスタンス型が考慮されます。

于 2012-05-02T10:17:13.897 に答える
0

メソッド TypeH はvirtualであるためです。
仮想を削除すると、派生参照型で派生メソッドが取得され、基本参照型で基本メソッドが取得されます。仮想では、実行時のチェックがあります。ベース参照が実際に派生型を指している場合、派生メソッドが呼び出されます。

于 2012-05-02T10:16:43.140 に答える
0

簡単に言えば、これはoverrideキーワードが基本クラス A のメソッドを「置き換える」ために発生し、この基本クラスにキャストしてもそのままです。

ただし、クラス B を次のように変更した場合:

public new void TypeH()

その場合、newキーワードは、TypeH の基本クラス A 実装を非表示にします。この場合、基本クラス A にキャストすると、TypeH の基本クラス A 実装が得られます。あなたの例は「A」を出力します。

于 2012-05-02T10:52:20.443 に答える