polimorfisme
Polimorfisme adalah salah satu fitur penting dari pemrograman berorientasi objek. Arti literalnya dapat secara sederhana dipahami sebagai: berbagai bentuk, banyak tampilan. Sebenarnya arti dasarnya sama, dalam pemrograman berorientasi objek artinya metode yang sama akan mempunyai efek eksekusi yang berbeda bila dijalankan oleh objek yang berbeda.
Secara khusus, implementasi polimorfisme dapat dibagi menjadi dua jenis: polimorfisme waktu kompilasi dan polimorfisme waktu proses. Yang pertama adalah proses operasi spesifik yang ditentukan saat kompilasi, dan yang terakhir adalah proses operasi yang hanya ditentukan selama menjalankan program. Penentuan proses operasi ini bersifat mengikat atau disebut juga binding .
Pengikatan yang dikonfirmasi selama kompilasi dan koneksi disebut pengikatan statis . Fungsi yang berlebihan dan contoh templat fungsi yang kita pelajari sebelumnya termasuk dalam kategori ini. Yang lainnya adalah mengonfirmasi bagian kode mana yang dieksekusi saat sedang berjalan, yang disebut pengikatan dinamis . Dalam hal ini, tidak mungkin untuk mengonfirmasi bagian kode mana yang dieksekusi saat kompilasi, tetapi hanya dapat dikonfirmasi setelah program selesai. berlari.
Membandingkan keduanya, pengikatan statis sudah menentukan cara mengeksekusinya selama kompilasi, sehingga efisien dalam eksekusi, sedangkan pengikatan dinamis harus lebih lambat, namun keunggulannya adalah fleksibilitas; Keduanya memiliki kelebihan dan skenario penggunaan yang berbeda.
Di bawah ini, kami akan memberi Anda contoh sederhana seputar tautan statis:
/***************************************//Des: Demo tutorial C++ //Penulis: Huang/ /Hak Cipta:www.dotcpp.com//Tanggal:2017/12/20********************************* *** ** *****/#include<iostream>usingnamespacestd;#definePI3.1415926classPoint{private:intx,y;public:Point(intx=0,inty=0){ini->x=x;ini->y=y ;}doublerea (){return0.0;}};classCircle:publicPoint{private:intr;public:Circle(intx,inty,intR):Point(x,y){r=R;}doublearea(){returnPI*r*r ;}};intmain(){TitikA (10,10);cout<<A.area()<<endl;LingkaranB(10,10,20);cout<<B.area()<<endl;Titik*p;p=&B;cout<< p->area()<<endl;Titik&pp=B;cout<<pp.area()<<endl;return0;}
Dua kelas didefinisikan, kelas titik dan kelas lingkaran turunan. Anda dapat melihat kode fungsi utama dan empat hasil area keluaran.
Anda dapat membandingkan kode untuk memahami empat keluaran:
Cout pertama mengeluarkan luas A yang merupakan metode luas pada kelas Point Luasnya 0, jadi tidak ada masalah.
Cout kedua menghasilkan luas B, yang jelas merupakan metode luas dari kelas turunan Lingkaran. Luas dihitung secara alami berdasarkan rumus dan nilainya adalah 1256,64, yang tidak menjadi masalah.
Cout ketiga mengeluarkan metode area dari objek kelas Lingkaran yang ditunjuk oleh penunjuk tipe Titik p. Ini menghasilkan 0, yang jelas merupakan metode area di kelas Titik. Yang diimplementasikan C++ disini adalah static binding, yaitu pada saat kompilasi menentukan area mana yang akan dieksekusi berdasarkan tipe p, jadi 0.
Tipe cout keempat bekerja dengan cara yang sama. Ini menetapkan objek tipe Lingkaran ke referensi tipe Titik. C++ juga melakukan pengikatan statis dan juga menghasilkan 0.
Jelas ini bukan hasil yang kami harapkan. Faktanya, untuk pointer dan referensi, kami lebih memilih untuk mengeksekusi metode objek sebenarnya, daripada menentukan jenis pointer dan referensi secara membabi buta. Ini masalahnya jika ditulis seperti ini.
Jika Anda ingin memenuhi persyaratan kami, apa pun jenis penunjuk atau referensinya, hal itu harus diputuskan secara fleksibel berdasarkan objek sebenarnya yang ditunjuk. Kemudian kita perlu mengubah metode pengikatan statis default ini dan menggunakan pengikatan dinamis, yaitu diputuskan secara fleksibel saat runtime.
Di bagian selanjutnya, fungsi virtual akan dijelaskan secara detail untuk semua orang!