Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah Saya Boleh Memanggil Kaedah Kelas Asas Daripada Kelas Terbitan Yang Telah Mengatasinya?

Bagaimanakah Saya Boleh Memanggil Kaedah Kelas Asas Daripada Kelas Terbitan Yang Telah Mengatasinya?

Barbara Streisand
Lepaskan: 2024-12-30 06:07:12
asal
1003 orang telah melayarinya

How Can I Call a Base Class Method From a Derived Class That Has Overridden It?

Memanggil base.base.method() Secara Luar Biasa

Apabila memperoleh kelas daripada struktur asas, kata kunci asas membenarkan akses kepada ahli yang ditakrifkan dalam kelas induk terdekat. Walau bagaimanapun, dalam situasi yang luar biasa, mungkin terdapat keperluan untuk menggunakan kaedah daripada kelas lebih jauh daripada hierarki warisan.

Pertimbangkan senario kod yang disediakan, di mana Derived menggantikan Say() kaedah Asas. Dalam SpecialDerived, penggantian seterusnya Say() memanggil base.Say(), berhasrat untuk melaksanakan Say() daripada Asas.

Dijangka vs. Gelagat Sebenar

Keluaran yang dijangkakan ialah:

Called from Special Derived.
Called from Base.
Salin selepas log masuk

Walau bagaimanapun, disebabkan oleh sifat mengatasi kaedah, output sebenar termasuk panggilan yang tidak dijangka kepada Sebut() daripada Diperoleh:

Called from Special Derived.
Called from Derived.
Called from Base.
Salin selepas log masuk

Menangani Isu

Sejak penyeruan langsung base .base.method() tidak disokong, pendekatan alternatif diperlukan. Pelaksanaan dikemas kini yang disediakan dalam SpecialDerived menunjukkan perkara ini:

class SpecialDerived : Derived
{
    public override void Say()
    {
        Console.WriteLine("Called from Special Derived.");
        CustomSay(); // Calls CustomSay() from Derived instead of Say()
        base.Say();
    }

    protected virtual void CustomSay()
    {
        Console.WriteLine("Called from Derived.");
    }
}
Salin selepas log masuk

Dengan mentakrifkan kaedah maya yang dilindungi tambahan, CustomSay(), Derived boleh mengendalikan tingkah laku yang diingini tanpa menjejaskan terbitan lain kelas.

Pendekatan Refleksi Alternatif

Dalam senario di mana pengubahsuaian struktur warisan tidak dapat dilaksanakan, pendekatan berasaskan refleksi boleh digunakan seperti yang ditunjukkan di bawah:

class SpecialDerived : Derived
{
    public override void Say()
    {
        Console.WriteLine("Called from Special Derived.");
        var ptr = typeof(Base).GetMethod("Say").MethodHandle.GetFunctionPointer();            
        var baseSay = (Action)Activator.CreateInstance(typeof(Action), this, ptr);
        baseSay();            
    }
}
Salin selepas log masuk

Pendekatan ini menggunakan refleksi untuk mendapatkan semula secara dinamik Kaedah Sebut() daripada Base dan laksanakannya secara langsung, memintas proses penyelesaian kaedah standard.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Memanggil Kaedah Kelas Asas Daripada Kelas Terbitan Yang Telah Mengatasinya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan