Menguasai Fungsi Virtual C++: Konsep, Contoh, dan Kata Kunci Override
Fungsi Virtual C++
Tutorial ini menjelaskan fungsi virtual C++, tujuannya, dan penggunaan praktis yang diilustrasikan dengan contoh kode.
Fungsi virtual adalah anggota kelas dasar yang diharapkan akan digantikan oleh kelas turunan. Mendeklarasikan fungsi sebagai virtual memastikan bahwa implementasi paling turunan dipanggil, bahkan ketika diakses melalui pointer atau referensi kelas dasar.
Ketika kelas dasar memiliki anggota non-virtual, memanggil anggota tersebut melalui pointer dasar akan selalu mengeksekusi versi dasar, terlepas dari tipe objek aktual. Pertimbangkan berikut:
class Base { public: void print() { // implementasi dasar } }; class Derived : public Base { public: void print() { // implementasi turunan } };
Dalam program di bawah ini, sebuah Base* menunjuk ke instance Derived, namun print() menyelesaikan ke versi dasar:
Untuk mencapai perilaku polimorfisme, deklarasikan fungsi sebagai virtual di kelas dasar:
class Base { public: virtual void print() { // implementasi dasar } };
Fungsi virtual adalah pusat dari polimorfisme C++. Untuk mendalami lebih lanjut, lihat panduan Polimorfisme C++ kami.
Contoh 1: Penggunaan Dasar Fungsi Virtual
#include <iostream> using namespace std; class Base { public: virtual void print() { cout << "Fungsi Dasar" << endl; } }; class Derived : public Base { public: void print() override { cout << "Fungsi Turunan" << endl; } }; int main() { Derived derived1; Base* base1 = &derived1; base1->print(); // mencetak Fungsi Turunan return 0; }
Output
Fungsi Turunan
Karena Base::print adalah virtual, pangkalan dispatch ke Derived::print bahkan melalui pointer dasar.
Kata Kunci Override C++
Sejak C++11, kata kunci override membantu mencegah penggantian yang tidak sengaja dengan memaksa kompiler untuk memverifikasi bahwa fungsi benar-benar menggantikan anggota virtual dasar.
Contoh:
class Base { public: virtual void print() { // implementasi dasar } }; class Derived : public Base { public: void print() override { // implementasi turunan } };
Jika Anda mendefinisikan fungsi pengganti di luar kelas, gunakan:
class Derived : public Base { public: void print() override; // deklarasi }; void Derived::print() { // implementasi }
Menggunakan override dengan Aman
Tanpa override, kesalahan ketik atau ketidakcocokan tanda tangan secara diam-diam menghasilkan fungsi baru daripada pengganti, yang mengakibatkan bug yang halus. Kompiler kemudian akan mengeluarkan kesalahan, sehingga masalah segera terlihat. Jebakan umum meliputi:
Nama yang tidak cocok: misalnya, pint() alih-alih print()
Tipe pengembalian yang berbeda: misalnya, mengembalikan int alih-alih void
Ketidakcocokan parameter: daftar parameter yang berbeda
Virtual yang hilang di dasar: fungsi dasar sama sekali bukan virtual
Penggunaan Praktis Fungsi Virtual
Pertimbangkan kelas dasar Animal dengan kelas turunan Dog dan Cat. Setiap kelas memiliki anggota type yang diinisialisasi oleh konstruktor.