pautan statik php. Pengikatan statik lewat. Contoh pengikatan statik dan dinamik dalam Java

Perenggan ini, walaupun ringkas, sangat penting - hampir semua profesional pengaturcaraan di Jawa ia berdasarkan penggunaan polimorfisme. Pada masa yang sama, topik ini adalah antara yang paling sukar untuk difahami oleh pelajar. Oleh itu, adalah disyorkan untuk membaca semula perenggan ini dengan teliti beberapa kali.

Kaedah kelas ditandakan dengan pengubah suai statik atas sebab - bagi mereka, apabila menyusun kod program, pautan statik. Ini bermakna bahawa dalam konteks kelas mana nama kaedah ditentukan dalam kod sumber, pautan diletakkan ke kaedah kelas tersebut dalam kod yang disusun. Iaitu, ia dijalankan pengikatan nama kaedah di tempat panggilan dengan kod boleh laku kaedah ini. Kadang-kadang pautan statik dipanggil pengikatan awal, kerana ia berlaku pada peringkat penyusunan program. Pautan statik di Java ia digunakan dalam satu lagi kes - apabila kelas diisytiharkan dengan pengubah akhir ("akhir", "akhir").

Kaedah objek dalam Java adalah dinamik, iaitu, ia tertakluk kepada pautan dinamik. Ia berlaku pada peringkat pelaksanaan program secara langsung semasa panggilan kaedah, dan pada peringkat penulisan kaedah ini tidak diketahui terlebih dahulu dari kelas mana panggilan akan dibuat. Ini ditentukan oleh jenis objek yang mana kod ini berfungsi - kelas mana objek itu dimiliki, dari kelas mana kaedah dipanggil. Pengikatan ini berlaku lama selepas kod kaedah telah disusun. Oleh itu, jenis pengikatan ini sering dipanggil pengikatan lewat.

Kod pengaturcaraan berasaskan panggilan kaedah dinamik, mempunyai harta polimorfisme– kod yang sama berfungsi secara berbeza bergantung pada jenis objek yang memanggilnya, tetapi melakukan perkara yang sama pada tahap abstraksi yang berkaitan dengan kod sumber kaedah.

Untuk menerangkan perkataan ini, yang tidak begitu jelas pada bacaan pertama, mari kita pertimbangkan contoh dari perenggan sebelumnya - kerja kaedah moveTo. Pengaturcara yang tidak berpengalaman berpendapat bahawa kaedah ini harus diatasi dalam setiap kelas keturunan. Ini sebenarnya boleh dilakukan, dan semuanya akan berfungsi dengan betul. Tetapi kod sedemikian akan menjadi sangat berlebihan - selepas semua, pelaksanaan kaedah itu akan berada dalam semua kelas keturunan Rajah betul-betul sama:

public void moveTo(int x, int y)( hide(); this.x=x; this.y=y; show(); );

Selain itu, kes ini tidak mengambil kesempatan daripada polimorfisme. Jadi kami tidak akan berbuat demikian.

Ia juga sering membingungkan mengapa kelas abstrak Rajah tulis pelaksanaan kaedah ini. Lagipun, panggilan ke kaedah sembunyi dan tunjukkan yang digunakan di dalamnya, pada pandangan pertama, haruslah panggilan kaedah abstrak– iaitu, mereka nampaknya tidak dapat bekerja sama sekali!

Tetapi kaedah sembunyi dan tunjukkan adalah dinamik, yang, seperti yang kita sedia maklum, bermakna perkaitan nama kaedah dan kod boleh lakunya dilakukan pada peringkat pelaksanaan program. Oleh itu, hakikat bahawa kaedah ini dinyatakan dalam konteks kelas Rajah, tidak bermakna mereka akan dipanggil daripada kelas Rajah! Selain itu, anda boleh menjamin bahawa kaedah hide and show tidak akan dipanggil daripada kelas ini. Biarkan kita mempunyai pembolehubah dot1 jenis Dot dan bulatan1 jenis Circle , dan ia diberikan rujukan kepada objek daripada jenis yang sepadan. Mari lihat bagaimana panggilan dot1.moveTo(x1,y1) dan circle1.moveTo(x2,y2) berkelakuan.

Apabila memanggil dot1.moveTo(x1,y1) terdapat panggilan daripada kelas Rajah kaedah moveTo. Sesungguhnya, kaedah ini dalam kelas Dot tidak ditindih, yang bermaksud ia diwarisi daripada Rajah. Dalam kaedah moveTo, pernyataan pertama ialah panggilan kepada kaedah hide dinamik. Pelaksanaan kaedah ini diambil dari kelas yang objek dot1 memanggil kaedah ini adalah contoh. Iaitu, dari kelas Dot. Oleh itu, perkara itu tersembunyi. Kemudian koordinat objek diubah, selepas itu ia dipanggil kaedah dinamik tunjuk. Pelaksanaan kaedah ini diambil dari kelas yang objek dot1 memanggil kaedah ini adalah contoh. Iaitu, dari kelas Dot. Oleh itu, satu titik ditunjukkan di lokasi baharu.

Untuk memanggil circle1.moveTo(x2,y2) semuanya benar-benar serupa - kaedah dinamik hide and show dipanggil daripada kelas yang objek circle1 adalah contoh, iaitu, dari kelas Circle. Oleh itu, ia adalah bulatan yang tersembunyi di tempat lama dan ditunjukkan dalam yang baru.

Iaitu, jika objek adalah titik, titik itu bergerak. Dan jika objek itu bulatan, bulatan itu bergerak. Lebih-lebih lagi, jika suatu hari nanti seseorang menulis, sebagai contoh, kelas Ellipse yang merupakan keturunan Bulatan dan mencipta objek Ellipse elips=Elips baharu(…), kemudian memanggil ellipse.moveTo(...) akan mengalihkan elips ke lokasi baharu. Dan ini akan berlaku mengikut cara kaedah hide and show dilaksanakan dalam kelas Ellipse. Ambil perhatian bahawa kod polimorfik kelas yang dikompilasi akan berfungsi lama dahulu Rajah. Polimorfisme dipastikan oleh fakta bahawa rujukan kepada kaedah ini tidak diletakkan dalam kod kaedah moveTo pada masa penyusunan - ia dikonfigurasikan kepada kaedah dengan nama sedemikian dari kelas objek panggilan serta-merta pada masa kaedah moveTo dipanggil.

Terdapat dua jenis bahasa pengaturcaraan berorientasikan objek: kaedah dinamik– sebenarnya dinamik dan maya. Menurut prinsip operasi, mereka sama sekali dan berbeza hanya dalam ciri pelaksanaan. Panggil kaedah maya lebih pantas. Memanggil yang dinamik adalah lebih perlahan, tetapi jadual perkhidmatan kaedah dinamik(DMT – Jadual Kaedah Dinamik) menggunakan memori kurang sedikit daripada jadual kaedah maya(VMT – Jadual Kaedah Maya).

Ia mungkin kelihatan seperti satu cabaran kaedah dinamik tidak cekap masa kerana tempoh masa yang diperlukan untuk mencari nama. Malah, tiada carian nama dilakukan semasa panggilan, tetapi mekanisme yang lebih pantas digunakan menggunakan jadual kaedah maya (dinamik) yang disebutkan. Tetapi kami tidak akan memikirkan secara spesifik pelaksanaan jadual ini, kerana Java tidak membezakan antara jenis kaedah ini.

6.8. Objek kelas asas

Kelas Objek ialah kelas asas untuk semua kelas Java. Oleh itu, semua bidang dan kaedahnya diwarisi dan terkandung dalam semua kelas. Kelas Objek mengandungi kaedah berikut:

  • Boolean awam sama (obj objek)– mengembalikan benar dalam kes apabila nilai objek dari mana kaedah dipanggil dan objek melalui rujukan obj dalam senarai parameter adalah sama. Jika objek tidak sama, false dikembalikan. Dalam kelas Objek, kesamaan dianggap sebagai kesamaan rujukan dan bersamaan dengan pengendali perbandingan "==" . Tetapi dalam keturunan kaedah ini boleh ditindih, dan boleh membandingkan objek dengan kandungannya. Sebagai contoh, ini berlaku untuk objek kelas numerik shell. Ini boleh disemak dengan mudah dengan kod seperti ini:

    Berganda d1=1.0,d2=1.0; System.out.println("d1==d2 ="+(d1==d2)); System.out.println("d1.equals(d2) ="+(d1.equals(d2)));

    Baris pertama output akan memberikan d1==d2 =false , dan yang kedua akan memberikan d1. sama dengan(d2)=benar

  • public int hashCode()- isu kod cincang objek. Kod cincang ialah pengecam berangka unik bersyarat yang dikaitkan dengan elemen. Atas sebab keselamatan, anda tidak boleh memberikan alamat objek kepada program aplikasi. Oleh itu, dalam Java, kod cincang menggantikan alamat objek dalam kes di mana untuk tujuan tertentu adalah perlu untuk menyimpan jadual alamat objek.
  • klon Objek dilindungi () melontar CloneNotSupportedException - kaedah menyalin objek dan mengembalikan pautan ke klon yang dicipta (pendua) objek. Dalam keturunan kelas Objek, adalah perlu untuk mentakrifkannya semula, dan juga menunjukkan bahawa kelas itu melaksanakan antara muka Klon. Cuba memanggil kaedah daripada sebab objek bukan klon menimbulkan pengecualian CloneNotSupportedException("Klon tidak disokong"). Antara muka dan situasi pengecualian akan dibincangkan kemudian.

    Terdapat dua jenis pengklonan: cetek (cetek), apabila nilai medan objek asal disalin satu-ke-satu ke dalam klon, dan dalam (dalam), di mana objek baru dicipta untuk medan jenis rujukan, mengklonkan objek yang dirujuk oleh medan asal. Dalam pengklonan cetek, kedua-dua yang asal dan klon akan merujuk objek yang sama. Jika objek mempunyai medan sahaja jenis primitif, tiada perbezaan antara pengklonan cetek dan dalam. Pelaksanaan pengklonan dijalankan oleh pengaturcara yang membangunkan kelas; tiada mekanisme pengklonan automatik. Dan pada peringkat pembangunan kelas anda harus memutuskan pilihan pengklonan yang mana untuk dipilih. Dalam kebanyakan kes ia diperlukan pengklonan mendalam.

  • Kelas akhir awam getClass()– mengembalikan rujukan kepada metaobjek jenis kelas. Dengan bantuannya, anda boleh mendapatkan maklumat tentang kelas yang mempunyai objek dan memanggil kaedah kelas dan medan kelasnya.
  • kekosongan dilindungi memuktamadkan() melontar Boleh Dilempar – dipanggil sebelum objek dimusnahkan. Mesti ditindih dalam keturunan Object di mana ia perlu melakukan beberapa tindakan tambahan sebelum memusnahkan objek (menutup fail, memaparkan mesej, melukis sesuatu pada skrin, dsb.). Kaedah ini diterangkan dengan lebih terperinci dalam perenggan yang sepadan.
  • String awam keString()– mengembalikan perwakilan rentetan objek (secukup mungkin). Dalam kelas Objek, kaedah ini menghasilkan rentetan nama objek yang layak sepenuhnya (dengan nama pakej), diikuti dengan aksara "@", dan kemudian kod cincang heksadesimal objek. Kebanyakan kelas standard mengatasi kaedah ini. Untuk kelas berangka, perwakilan rentetan nombor dikembalikan, untuk kelas rentetan - kandungan rentetan, untuk kelas aksara - aksara itu sendiri (dan bukan perwakilan rentetan kodnya!). Contohnya, coretan kod berikut

    Objek obj=Objek baharu(); System.out.println(" obj.toString() memberikan "+obj.toString()); Double d=new Double(1.0); System.out.println(" d.toString() memberikan "+d.toString()); Aksara c="A"; System.out.println("c.toString() memberikan "+c.toString());

    akan memberikan kesimpulan

    obj.toString() memberikan java.lang.Object@fa9cf d.toString() memberikan 1.0 c.toString() memberikan A

Terdapat juga kaedah memberitahu(), notifyAll(), dan beberapa varian terlebih beban kaedah tunggu, direka untuk berfungsi dengan benang. Ini dibincangkan dalam bahagian mengenai benang.

6.9. Pereka bentuk. Terpelihara perkataan super dan ini. Blok permulaan

Seperti yang telah disebutkan, objek dalam Java dicipta menggunakan perkataan rizab baru, diikuti oleh pembina - subrutin khas yang mencipta objek dan memulakan medan objek yang dicipta. Jenis pulangan tidak ditentukan untuknya, dan ia bukan kaedah objek (dipanggil melalui nama kelas apabila objek belum wujud) mahupun kaedah kelas (objek dan medannya boleh diakses dalam pembina melalui rujukan ini) . Malah, pembina, dalam kombinasi dengan pengendali baharu, mengembalikan rujukan kepada objek yang dicipta dan boleh dianggap sebagai jenis kaedah khas yang menggabungkan ciri kaedah kelas dan kaedah objek.

Jika objek tidak memerlukan sebarang permulaan tambahan apabila ia dicipta, anda boleh menggunakan pembina, yang hadir secara lalai untuk setiap kelas. Ini ialah nama kelas, diikuti dengan kurungan kosong - tanpa senarai parameter. Tidak perlu menentukan pembina sedemikian semasa membangunkan kelas; ia hadir secara automatik.

Jika permulaan diperlukan, pembina dengan senarai parameter biasanya digunakan. Kami melihat contoh pembina sedemikian untuk kelas Dot dan Bulatan. Kelas Dot dan Bulatan diwarisi daripada kelas abstrak, di mana tiada pembina. Sekiranya terdapat warisan daripada kelas bukan abstrak, iaitu, yang sudah mempunyai pembina (walaupun pembina lalai), beberapa kekhususan timbul. Pernyataan pertama dalam pembina mestilah panggilan kepada pembina daripada superclass. Tetapi ia dilakukan bukan melalui nama kelas ini, tetapi menggunakan perkataan terpelihara hebat(daripada "superclass"), diikuti dengan senarai parameter yang diperlukan untuk pembina datuk dan nenek. Pembina ini memulakan medan data yang diwarisi daripada superclass (termasuk daripada mana-mana nenek moyang terdahulu). Sebagai contoh, mari tulis kelas FilledCircle - keturunan Circle , contoh yang akan dilukis sebagai bulatan berwarna.

pakej java_gui_example; import java.awt.*; kelas awam FilledCircle memanjangkan Bulatan( /** Mencipta kejadian baharu bagi FilledCircle */ public FilledCircle(Grafik g,Color bgColor, int r,Color color) ( super(g,bgColor,r); this.color=color; ) public void show())( Color oldC=graphics.getColor(); graphics.setColor(color); graphics.setXORMode(bgColor); graphics.fillOval(x,y,saiz, saiz);graphic.setColor(oldC);graphics . setPaintMode(); ) public void hide())( Color oldC=graphics.getColor(); graphics.setColor(color); graphics.setXORMode(bgColor); graphics.fillOval(x,y,saiz,saiz);graphic .setColor (oldC); graphics.setPaintMode(); ))

Secara umum, logik untuk mencipta objek kompleks: bahagian induk objek dicipta dan dimulakan terlebih dahulu, bermula dari bahagian yang diwarisi dari kelas Objek, dan seterusnya di sepanjang hierarki, berakhir dengan bahagian kepunyaan kelas itu sendiri. Inilah sebabnya mengapa biasanya pernyataan pertama pembina adalah panggilan kepada pembina datuk nenek super ( senarai parameter), kerana mengakses bahagian objek yang tidak dimulakan yang dimiliki oleh kelas induk boleh membawa kepada akibat yang tidak dapat diramalkan.

Dalam kelas ini, kami menggunakan cara melukis dan "menyembunyikan" bentuk yang lebih maju berbanding kelas sebelumnya. Ia berdasarkan mod lukisan XOR (eksklusif atau). Mod ini ditetapkan menggunakan kaedah setXORMode. Dalam kes ini, output berulang angka ke tempat yang sama membawa kepada pemulihan imej asal dalam kawasan output. Peralihan kepada mod lukisan biasa dijalankan menggunakan kaedah setPaintMode.

Mereka sangat kerap digunakan dalam pembina

data . Matlamat polimorfisme, seperti yang digunakan pada pengaturcaraan berorientasikan objek, adalah untuk menggunakan satu nama untuk mentakrifkan tindakan yang biasa kepada kelas.

Di Java, pembolehubah objek adalah polimorfik. Sebagai contoh:
class King ( public static void main(String args) ( King king = new King() ; king = new AerysTargaryen() ; king = new RobertBaratheon() ; ) ) class RobertBaratheon extends King ( ) class AerysTargaryen extends King ( )
Pembolehubah jenis Raja boleh merujuk sama ada objek jenis Raja atau objek mana-mana subkelas Raja.
Mari kita ambil contoh berikut:

class King ( public void speech() ( System .out .println ("Saya Raja Andals!" ) ; ) public void speech(String quotation) ( System .out .println ("Orang bijak berkata: " + petikan) ; ) ucapan kosong awam(Boolean speakLoudly) ( if (speakLoudly) System .out .println ( "SAYA RAJA ANDALS!!!11"); else System .out .println ("i"m... the king..." ) ; ) ) class AerysTargaryen extends King ( @Override public void speech() ( System .out .println ("Bakar semuanya... " ; ) @Override public void speech(String quotation) ( System .out .println (quotation+ " ... Dan sekarang bakar semuanya!" ) ; ) ) class Kingdom ( public static void main(String args) ( King king = new AerysTargaryen() ; king.speech ("Homo homini lupus est" ) ; ) )
Apa yang berlaku apabila kaedah kepunyaan objek dipanggil raja?
1. Pengkompil menyemak jenis objek yang diisytiharkan dan nama kaedah, nombor semua kaedah dengan namaucapan dalam kelas AerusTagarien dan semua kaedah awam ucapan dalam kelas superAerusTagarien. Pengkompil kini mengetahui calon yang mungkin apabila memanggil kaedah.
2. Pengkompil menentukan jenis hujah yang dihantar kepada kaedah. Jika satu kaedah ditemui yang tandatangannya sepadan dengan hujah, panggilan dibuat.Proses iniking.speech("Homo homini lupus est") pengkompil akan memilih kaedahucapan (petikan rentetan), tetapi tidak ucapan().
Jika pengkompil menemui pelbagai kaedahdengan parameter yang sesuai (atau tiada), mesej ralat dipaparkan.



Pengkompil kini mengetahui nama dan jenis parameter kaedah yang akan dipanggil.
3. Sekiranya kaedah yang dipanggil ialahpersendirian, statik, muktamadatau pembina, pengikatan statik digunakan ( pengikatan awal). Dalam kes lain, kaedah untuk dipanggil ditentukan oleh jenis sebenar objek yang melaluinya panggilan itu berlaku. Itu. digunakan semasa pelaksanaan program pengikatan dinamik (pengikatan lewat).

4. Mesin maya pra-membuat jadual kaedah untuk setiap kelas yang menyenaraikan tandatangan semua kaedah dan kaedah sebenar yang akan dipanggil.
Jadual kaedah untuk kelasRaja kelihatan seperti itu:
  • ucapan() - Raja. ucapan()
  • ucapan(petikan rentetan) -Raja. ucapan (petikan rentetan)
  • Raja. pertuturan (Boolean speakLoudly)
Dan untuk kelasAerysTargaryen - seperti ini:
  • ucapan() - AerysTargaryen . ucapan()
  • ucapan(petikan rentetan) - AerysTargaryen. ucapan (petikan rentetan)
  • pertuturan(Boolean speakLoudly) -Raja. pertuturan (Boolean speakLoudly)
Kaedah yang diwarisi daripada Object diabaikan dalam contoh ini.
Apabila memanggilraja.ucapan():
  1. Jenis sebenar pembolehubah ditentukanraja . Dalam kes ini ia adalahAerysTargaryen.
  2. Mesin maya menentukan kelas kepunyaan kaedah tersebutucapan()
  3. Kaedahnya dipanggil.
Memautkan semua kaedah dalamJawadijalankan secara polimorfik, melalui pengikatan lewat.Pengikatan dinamik mempunyai satu ciri penting: ia membenarkanmengubah suai atur cara tanpa menyusun semula kod mereka. Inilah yang dilakukan oleh programboleh dikembangkan secara dinamik ( boleh dipanjangkan).
Apa yang berlaku jika anda memanggil kaedah terikat secara dinamik bagi objek yang dibina dalam pembina? Sebagai contoh:
kelas Raja ( Raja ( ) ( Sistem . keluar . println ( "Panggil Raja pembina"); pertuturan (); //kaedah polimorfik ditindih dalam AerysTargaryen) public void speech() ( System .out .println ("Saya Raja Andals!" ) ; ) ) class AerysTargaryen extends King ( private String victimName; AerysTargaryen() ( System .out .println ( "Panggil pembina Aerys Targaryen"); victimName = "Lyanna Stark" ; ucapan(); ) @Override public void speech() ( System .out .println ("Burn " + victimName + "!" ) ; ) ) class Kingdom ( public static void main(String args) ( King king = new AerysTargaryen() ; ) ) Keputusan:

Panggil pembina King Bakar null! Panggil pembina Aerys Targaryen Burn Lyanna Stark!
Pembina kelas asas sentiasa dipanggil semasa pembinaan kelas terbitan. Panggilan secara automatik bergerak ke atas rantaian warisan supaya pembina semua kelas asas di seluruh rantaian warisan akhirnya dipanggil.
Ini bermakna apabila memanggil pembina AerysTargaryen() baru akan dipanggil:
  1. Objek baru()
  2. Raja baru()
  3. baru AerysTargaryen()
Secara definisi, tugas pereka bentuk adalah untuk memberi kehidupan kepada objek. Di dalam mana-mana pembina, objek hanya boleh dibentuk sebahagian-semua yang diketahui ialah objek kelas asas telah dimulakan. Jika pembina hanyalah satu lagi langkah ke arah membina objek kelas yang diperoleh daripada kelas pembina ini, bahagian "terhasil" belum lagi dimulakan pada masa pembina semasa dipanggil.

Walau bagaimanapun, panggilan terikat secara dinamik boleh pergi ke bahagian "luar" hierarki, iaitu, ke kelas terbitan. Jika ia memanggil kaedah kelas terbitan dalam pembina, ini boleh membawa kepada manipulasi data yang tidak dimulakan, iaitu apa yang kita lihat dalam output contoh ini.

Hasil program ditentukan oleh pelaksanaan algoritma permulaan objek:

  1. Memori yang diperuntukkan untuk objek baru diisi dengan sifar binari.
  2. Pembina kelas asas dipanggil dalam susunan yang diterangkan sebelum ini. Pada ketika ini kaedah yang diganti dipanggil ucapan() (ya, sebelum memanggil pembina kelasAerysTargaryen), di mana didapati bahawa pembolehubah victimName adalah batal kerana peringkat pertama.
  3. Pemula ahli kelas dipanggil mengikut susunan di mana ia ditakrifkan.
  4. Badan pembina kelas terbitan dilaksanakan.
Khususnya, disebabkan isu tingkah laku sedemikian, adalah wajar mematuhi peraturan berikut untuk menulis pembina:
- lakukan dalam pembina hanya tindakan yang paling perlu dan mudah untuk memulakan objek
- jika boleh, elakkan memanggil kaedah yang tidak ditakrifkan sebagai persendirian atau muktamad (yang dalam konteks ini adalah perkara yang sama).
Bahan yang digunakan:
  1. Eckel B. - Berfikir di Jawa , Edisi ke-4 - Bab 8
  2. Cay S. Horstmann, Gary Cornell - Java Teras 1 - Bab 5
  3. Wikipedia

Mengikat- penggantian panggilan fungsi tertentu ke dalam kod program - kaedah kelas. Hanya masuk akal untuk kelas terbitan.

Biasanya pengkompil mempunyai maklumat yang diperlukan untuk menentukan fungsi mana yang dimaksudkan. Sebagai contoh, jika atur cara menghadapi panggilan ke obj.f(), pengkompil secara unik memilih fungsi f() bergantung pada jenis obj destinasi. Jika atur cara menggunakan penunjuk kepada contoh kelas:ptr->f(), pilihan fungsi - kaedah kelas ditentukan oleh jenis penunjuk.

Jika pemilihan fungsi dilakukan pada masa penyusunan, kami sedang berurusan pautan statik.

Dalam kes ini, fungsi - kaedah kelas asas - akan dipanggil untuk penunjuk kepada kelas asas, walaupun penunjuk kepada kelas asas diberikan nilai alamat contoh kelas terbitan.

Jika pemilihan fungsi dilakukan pada peringkat pelaksanaan program, kita sedang berurusan dengannya pautan dinamik.

Dalam kes ini, jika, semasa pelaksanaan program, penunjuk kepada kelas asas diberikan alamat contoh kelas asas, kaedah kelas asas akan dipanggil; Jika penunjuk kepada kelas asas diberikan alamat contoh kelas terbitan, kaedah kelas terbitan akan dipanggil.

Fungsi maya

Secara lalai, kelas terbitan dipautkan secara statik. Jika pengikatan dinamik hendak digunakan untuk mana-mana kaedah kelas, kaedah tersebut mesti diisytiharkan maya .

Fungsi maya:

    mempunyai kata kunci maya dalam prototaip dalam kelas asas;

    fungsi ahli kelas wajib:

    Semua kelas terbitan mesti mempunyai prototaip yang sama (menentukan perkataan maya dalam kelas terbitan tidak perlu).

Jika mana-mana kaedah dalam kelas terbitan mempunyai nama yang sama seperti dalam kelas asas, tetapi senarai parameter yang berbeza, kami mempunyai fungsi yang terlebih beban.

Contoh: Kelas Point dan Bulatan.

cetakan kekosongan maya();

Bulatan kelas: Public Point(

void print(); // anda boleh print void virtual();

Void Point::print()

cout<< "Point (" << x << ", " << y << ")";

void Bulatan::print()

cout<< "Circle with center in "; Point::print();

cout<< "and radius " << rad;

penggunaan:

Titik p1(3,5), p2(1,1), *pPtr;

Cicle c1(1), c2(p2, 1);

pPtr = pPtr->print(); // dapatkan: Mata (3, 5)

pPtr = pPtr->print(); // dapatkan:

Bulatan dengan pusat dalam Titik (1, 1) dan jejari 1

Ikatan Dinamik Contoh: Senarai

Penggunaan pengikatan dinamik yang paling biasa ialah dengan kelas kontena yang mengandungi penunjuk ke kelas asas; Kelas kontena sedemikian boleh termasuk maklumat yang berkaitan dengan kedua-dua kelas asas dan mana-mana kelas terbitan.

Mari kita pertimbangkan contoh - senarai yang mengandungi kedua-dua titik dan bulatan.

// pembina

Item():info(NULL), seterusnya(NULL)()

Item(Titik *p):maklumat(p), seterusnya(NULL)()

Senarai():kepala(NULL)()

sisipan batal(Titik *p)(p->seterusnya = kepala; kepala = p;)

Void List::print()

untuk(Item *cur = kepala; cur; cur = cur->next)(

cur->info->print();

cout<< endl;

Menggunakan kelas:

Titik *p = new Point(1,2);

mylist.insert(p);

p = Kitaran baharu(1,2,1);

mylist.insert(p);

Bulatan dengan pusat dalam Titik (1, 2) dan jejari 1