Pelajaran modul (2/2)
Polimorfisme dan fungsi virtual
Polimorfisme memungkinkan kita memperlakukan objek dari kelas turunan yang berbeda melalui pointer atau referensi ke kelas dasarnya, memastikan versi metode yang benar dipanggil saat runtime (Late Binding).
Fungsi Virtual: virtual dan override
Untuk mengaktifkan polimorfisme pada suatu metode, kita harus mendeklarasikannya menggunakan kata kunci virtual di dalam kelas dasar. Di kelas turunan, kami menggunakan penentu override untuk secara eksplisit menyatakan bahwa kami mengganti metode tersebut.
class Employee {
public:
virtual void work() {
std::cout << "Generic work" << std::endl;
}
// IMPORTANT: Virtual destructor in base class to avoid memory leaks
virtual ~Employee() = default;
};
class Developer : public Employee {
public:
void work() override {
std::cout << "Writing C++ code" << std::endl;
}
};Menggunakan pointer ke kelas dasar, C++ akan menyelesaikan metode yang benar saat runtime:
Employee* emp = new Developer();
emp->work(); // Prints "Writing C++ code" instead of "Generic work"
delete emp;Kelas Abstrak dan Fungsi Virtual Murni
Fungsi virtual murni adalah fungsi anggota virtual yang dideklarasikan dengan = 0 di akhir. Ini mewakili kontrak formal: kelas dasar tidak memberikan implementasi, mendelegasikannya sepenuhnya ke subkelas.
Kelas yang berisi setidaknya satu fungsi virtual murni disebut Kelas Abstrak dan tidak dapat dipakai secara langsung.
class Instrument {
public:
virtual void play() = 0; // Pure virtual
virtual ~Instrument() = default;
};
class Piano : public Instrument {
public:
void play() override {
std::cout << "Playing piano..." << std::endl;
}
};Cobalah sendiri
Tentukan metode virtual makeSound() di Hewan yang mencetak 'Beberapa suara'. Kemudian timpa di kelas Cat menggunakan penentu override untuk mencetak 'Meow'.
Tunjukkan petunjuk
Ingatlah untuk menambahkan `virtual` ke metode kelas dasar dan menempatkan `override` setelah tanda kurung parameter di kelas turunan.
Solusi tersedia setelah 3 upaya
Deklarasikan fungsi virtual murni print() yang mengembalikan void dalam kelas abstrak Printable. Kemudian buat kelas Dokumen yang diwarisi secara publik dari Printable dan implementasikan metode print() untuk mencetak 'Pencetakan Dokumen'.
Tunjukkan petunjuk
Fungsi virtual murni dideklarasikan dengan tanda tangan `virtual void print() = 0;`. Pastikan `Dokumen` mewarisi secara publik dari `Dapat Dicetak`.
Solusi tersedia setelah 3 upaya