Direkomendasikan, 2024

Pilihan Editor

Perbedaan Antara Fungsi Overloading dan Overriding di C ++

Polimorfisme adalah salah satu fitur penting dari OOP. Ini hanya berarti 'menggunakan satu nama untuk berbagai bentuk'. Polimorfisme dapat diimplementasikan menggunakan 'function overloading', 'operator overloading' dan 'virtual function'. Keduanya, 'overloading' dan 'overriding' menyiratkan konsep polimorfisme. Di sini, 'overloading' adalah kompilasi polimorfisme waktu dan 'overriding' adalah polimorfisme run time. Mempelajari lebih lanjut, jika kita berbicara tentang perbedaan utama dalam 'kelebihan beban' dan 'kelebihan'. Dalam 'overloading' kami mendefinisikan kembali fungsi-fungsi yang kelebihan beban dengan nama fungsi yang sama tetapi, jumlah dan jenis parameter yang berbeda. Dalam prototipe 'override' fungsi override sama di seluruh program tetapi, fungsi yang akan ditimpa didahului oleh kata kunci 'virtual' di kelas dasar dan didefinisikan ulang oleh kelas turunan tanpa kata kunci apa pun.

Lebih lanjut, kami mempelajari perbedaan antara overloading dan overriding dengan bantuan grafik perbandingan.


Grafik perbandingan:

Dasar untuk PerbandinganKelebihan bebanUtama
PrototipePrototipe berbeda karena jumlah atau tipe parameter mungkin berbeda.Semua aspek prototipe harus sama.
Kata kunciTidak ada kata kunci yang diterapkan selama pemuatan berlebih.Fungsi yang akan ditimpa diawali dengan kata kunci 'virtual', di kelas dasar.
Faktor pembedaJumlah atau jenis parameter berbeda yang menentukan versi fungsi yang dipanggil.Fungsi kelas mana yang dipanggil oleh pointer, ditentukan oleh, alamat objek kelas mana yang ditugaskan ke pointer itu.
Menentukan polaFungsi didefinisikan ulang dengan nama yang sama, tetapi berbeda jumlah dan jenis parameter.Fungsi didefinisikan, didahului oleh kata kunci 'virtual' di kelas utama dan didefinisikan ulang oleh kelas turunan tanpa kata kunci keluar.
Waktu pencapaianWaktu kompilasi.Jalankan waktu.
Fungsi konstruktor / VirtualKonstruktor dapat kelebihan beban.Fungsi virtual dapat diganti.
Destructor
Destructor tidak dapat di-overload.Destructor dapat diganti.
MengikatOverloading mencapai ikatan awal.Overriding mengacu pada ikatan yang terlambat.

Definisi Kelebihan Beban

Polimorfisme waktu-kompilasi disebut 'kelebihan beban'. Karena kelebihan beban dihasilkan dari konsep polimorfisme, ini memberikan "antarmuka umum untuk banyak metode". Itu berarti, jika suatu fungsi kelebihan beban, itu berisi nama fungsi yang sama saat didefinisikan ulang.

Fungsi kelebihan beban berbeda dalam hal berbeda 'jumlah atau jenis parameter', itu membuat satu fungsi kelebihan beban berbeda dari yang lain. Dengan cara ini, kompiler mengenali fungsi kelebihan beban yang dipanggil. Fungsi yang paling sering kelebihan beban adalah 'konstruktor'. 'Copy constructor' adalah sejenis “constructor overloading”.

Implementasi overloading di C ++

 class overload {int a, b; public: int load (int x) {// first load () berfungsi a = x; mengembalikan a; } int load (int x, int y) {// load kedua () berfungsi a = x; b = y; kembalikan a * b; }}; int main () {overload O1; O1.load (20); // fungsi pemuatan pertama () memanggil O1.load (20, 40); // pemanggilan fungsi load kedua ()} 

Di sini fungsi memuat () kelas yang berlebihan telah kelebihan beban. Dua fungsi overload dari kelas dapat dibedakan dengan cara bahwa fungsi load () yang pertama hanya menerima parameter integer tunggal, sedangkan fungsi load () yang kedua menerima dua parameter integer. Ketika objek kelas yang berlebihan memanggil fungsi load () dengan parameter tunggal, fungsi first load () dipanggil. Ketika objek memanggil fungsi load () melewati dua parameter, fungsi load () kedua dipanggil.

Definisi Overriding

Polimorfisme yang dicapai selama run-time disebut 'overriding'. Ini dicapai dengan menggunakan 'warisan' dan 'fungsi virtual'. Fungsi yang akan ditimpa diawali oleh kata kunci 'virtual' di kelas dasar dan didefinisikan ulang di kelas turunan tanpa kata kunci apa pun.

Salah satu hal yang paling penting untuk diingat dalam kasus penimpaan adalah bahwa prototipe fungsi yang ditimpa tidak boleh berubah sementara kelas turunan mendefinisikannya kembali. Ketika fungsi yang ditimpa diberi panggilan, C ++ menentukan versi fungsi yang dipanggil berdasarkan 'tipe objek yang ditunjuk oleh pointer' yang digunakan untuk memanggil fungsi.

Implementasi Overriding di C ++

 basis kelas {publik: virtual void funct () {// fungsi virtual cout kelas dasar << "Ini adalah fungsi kelas dasar ()"; }}; class deriv1: public base {public: void funct () {// fungsi virtual dari base class didefinisikan ulang dalam c1 class turunan << "Ini adalah funct ()" turunan dari class1 yang diturunkan () "; }}; class deriv2: public base {public: void funct () {// fungsi virtual dari kelas dasar didefinisikan ulang dalam cout class yang diturunkan2  funct (); // panggil ke func1 kelas func1 (). * p = & d2; p-> funct (); // panggil ke funct class2 turunan (). return 0; } 

Di sini, ada satu kelas dasar yang secara publik diwarisi oleh dua kelas turunan. Fungsi virtual didefinisikan dalam kelas dasar dengan kata kunci 'virtual', dan didefinisikan ulang oleh kedua kelas turunan tanpa kata kunci. Di main (), kelas dasar membuat variabel pointer 'p' dan objek 'b'; 'turunan1 ′ kelas menciptakan objek d1 dan kelas turunan2 menciptakan objek d2'.

Sekarang, awalnya alamat objek kelas dasar 'b' ditugaskan ke pointer dari kelas dasar 'p'. 'p' memberikan panggilan ke function funct (), jadi fungsi dari kelas dasar dipanggil. Kemudian alamat objek turunan kelas 'd1' ditugaskan ke penunjuk 'p', lagi-lagi ia memberikan panggilan ke funct (); di sini fungsi funct () dari derivate class dijalankan. Akhirnya, pointer 'p' ditugaskan ke objek kelas turunan2. Kemudian 'p' memanggil fungsi funct () yang mengeksekusi fungsi func () dari turunan kelas2.

Jika turunan kelas1 / turunan2 tidak mendefinisikan ulang funct (), maka funct () dari kelas dasar akan dipanggil, karena fungsi virtual 'hierarkis.'

Perbedaan Kunci Antara Overloading dan Overriding

  1. Prototipe fungsi yang kelebihan beban berbeda karena jenis dan jumlah parameter yang dilewatkan ke fungsi kelebihan beban. Di sisi lain, prototipe fungsi yang ditimpa tidak berubah karena fungsi yang ditimpa melakukan tindakan yang berbeda untuk kelas yang berbeda miliknya tetapi dengan jenis dan jumlah parameter yang sama.
  2. Nama fungsi berlebih tidak mendahului dengan kata kunci apa pun, sedangkan nama fungsi yang ditimpa diawali dengan kunci "Virtual" di kelas dasar saja.
  3. Fungsi kelebihan beban mana yang dipanggil tergantung pada jenis atau jumlah parameter yang diteruskan ke fungsi tersebut. Fungsi yang dikesampingkan dari mana kelas dipanggil bergantung pada, alamat objek kelas mana yang ditugaskan ke pointer, yang dipanggil fungsi.
  4. Fungsi kelebihan beban mana yang akan dipanggil diselesaikan selama waktu kompilasi. Fungsi yang ditimpa yang akan dipanggil diselesaikan selama runtime.
  5. Konstruktor dapat kelebihan beban tetapi tidak dapat diganti.
  6. Destructors tidak bisa kelebihan beban, tetapi mereka bisa diganti.
  7. Overloading mencapai pengikatan awal karena fungsi kelebihan beban akan dipanggil diselesaikan selama waktu kompilasi. Mengesampingkan mencapai pengikatan terlambat karena fungsi yang ditimpa akan dipanggil diselesaikan selama runtime.

Kesamaan

  1. Keduanya diterapkan pada fungsi anggota suatu kelas.
  2. Polimorfisme adalah konsep dasar di belakang keduanya.
  3. Nama fungsi tetap sama saat kami menerapkan kelebihan dan overriding ke fungsi.

Kesimpulan

Overloading dan overriding tampak serupa, tetapi ini tidak terjadi. Fungsi dapat kelebihan beban tetapi, setiap kelas tidak dapat mendefinisikan kembali fungsi kelebihan beban di masa depan. Fungsi virtual tidak dapat kelebihan beban; mereka hanya bisa ditimpa.

Top