Penimpaan method
Termasuk bagian Pemrograman Berorientasi Object dalam perjalanan C++ di Coddy. Pelajaran 51 dari 104.
Method overriding terjadi ketika sebuah class turunan menyediakan implementasinya sendiri untuk method yang sudah ada di class dasar. Ini memungkinkan class turunan menyesuaikan perilaku yang diwarisi sambil tetap menggunakan signature method yang sama.
Untuk meng-override method, cukup definisikan method di class turunan dengan nama, tipe pengembalian, dan parameter yang sama persis:
class Animal {
public:
void speak() {
std::cout << "Some sound" << std::endl;
}
};
class Dog : public Animal {
public:
void speak() {
std::cout << "Woof!" << std::endl;
}
};
Dog d;
d.speak(); // output: Woof!Versi class turunan menyembunyikan versi class dasar. Namun, kamu masih bisa mengakses method class dasar menggunakan operator resolusi cakupan:
class Dog : public Animal {
public:
void speak() {
Animal::speak(); // Panggil versi class dasar
std::cout << "Woof!" << std::endl;
}
};Ada batasan penting pada bentuk dasar overriding ini. Saat kamu mengakses object turunan melalui pointer atau referensi ke class dasar, versi class dasar yang dipanggil:
Dog d;
Animal* ptr = &d;
ptr->speak(); // output: Some sound (bukan Woof!)Hal ini terjadi karena compiler menentukan method yang akan dipanggil berdasarkan tipe pointer, bukan tipe object yang sebenarnya. Untuk mendapatkan polimorfisme runtime yang memanggil method yang tepat berdasarkan object sebenarnya, kamu memerlukan fungsi virtual, yang akan kita bahas di pelajaran berikutnya.
Tantangan
MudahMari buat sistem notifikasi yang menunjukkan cara kerja method overriding. Kamu akan membuat class dasar Notifier dan dua notifier khusus yang menyesuaikan cara pesan dikirim.
Kamu akan mengatur kodemu dalam tiga file:
Notifier.h: Definisikan class dasarNotifierdengan:- Anggota
std::string recipientyang dilindungi - Konstruktor yang menerima nama penerima dan menyimpannya
- Method publik
send(const std::string& message)yang mencetak:Sending to <recipient>: <message>
- Anggota
EmailNotifier.h: Definisikan classEmailNotifieryang mewarisiNotifiersecara publik:- Konstruktor yang menerima penerima dan meneruskannya ke class dasar
- Override method
send()dengan memanggil versi class dasar terlebih dahulu menggunakanNotifier::send(), lalu mencetak:[Email sent successfully]
main.cpp: Baca dua input (masing-masing pada baris terpisah):- Nama penerima (string)
- Isi pesan (string)
Definisikan class
SMSNotifierlangsung di main.cpp yang mewarisiNotifiersecara publik:- Konstruktor yang menerima penerima dan meneruskannya ke class dasar
- Override method
send()untuk mencetak:SMS to <recipient>: <message>(sepenuhnya menggantikan perilaku dasar tanpa memanggilnya)
Buat satu object dari setiap jenis notifier (dasar
Notifier,EmailNotifier, danSMSNotifier) menggunakan penerima yang sama. Panggilsend()pada setiap object dengan pesan input, lalu cetak satu baris pemisah di antaranya:--- Base Notifier --- <output> --- Email Notifier --- <output> --- SMS Notifier --- <output>
Contohnya, dengan input Alice dan Hello there!:
--- Base Notifier ---
Sending to Alice: Hello there!
--- Email Notifier ---
Sending to Alice: Hello there!
[Email sent successfully]
--- SMS Notifier ---
SMS to Alice: Hello there!Perhatikan cara EmailNotifier memperluas perilaku dasar dengan memanggil method induk terlebih dahulu, sementara SMSNotifier sepenuhnya menggantinya dengan implementasinya sendiri. Jangan lupa menyertakan header guard dan header yang sesuai di setiap file.
Coba sendiri
#include <iostream>
#include <string>
#include "Notifier.h"
#include "EmailNotifier.h"
using namespace std;
// TODO: Definisikan class SMSNotifier di sini yang mewarisi Notifier secara publik
// - Konstruktor yang meneruskan recipient ke class dasar
// - Timpa send() untuk mencetak: SMS to <recipient>: <message>
// (ganti sepenuhnya perilaku dasar, jangan panggil send() milik induk)
int main() {
string recipient;
string message;
getline(cin, recipient);
getline(cin, message);
// TODO: Buat object Notifier dengan recipient
// Cetak "--- Base Notifier ---"
// Panggil send() dengan message
// TODO: Buat object EmailNotifier dengan recipient
// Cetak "--- Email Notifier ---"
// Panggil send() dengan message
// TODO: Buat object SMSNotifier dengan recipient
// Cetak "--- SMS Notifier ---"
// Panggil send() dengan message
return 0;
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Object
1Dasar-Dasar OOP
File EksternalBuild dan Kompilasi C++File Header dan File SourceNamespace dan CakupanPengantar OOP dalam C++class vs objectPointer 'this'method (Fungsi Anggota)Atribut (Anggota Data)Dasar Ctor dan DtorRingkasan: Kalkulator Sederhana4Properti class
Anggota instance vs staticGetter dan setterFungsi anggota constKata kunci mutableMethod dan variabel staticFungsi dan class friendRangkuman, Pengelola Rekening Bank7Pewarisan
Pewarisan DasarTingkat Akses pada PewarisanUrutan Pemanggilan Ctor & DtorPenimpaan methodFungsi Virtual & VTablePewarisan BergandaPewarisan VirtualRangkuman: Hierarki Karyawan2Manajemen Memori
Memori Stack vs HeapPointer dan ReferenceMemori Dinamis (new/delete)Smart Pointer di C++RAII di C++Rangkuman: Pengelola Array Dinamis5Enkapsulasi
Penentu Akses dalam C++Penentu Akses secara MendalamPenyembunyian Informasistruct vs classNested dan Inner classRangkuman, Sistem Catatan Siswa8Polimorfisme
Polimorfisme saat Compile vs RuntimeOverloading FungsiMeninjau Kembali Fungsi VirtualFungsi Virtual MurniKelas AbstrakDesain Interface di C++Casting Dinamis & RTTIRangkuman: Kalkulator Bentuk3Konstruktor & Destruktor
Konstruktor DefaultKonstruktor BerparameterKonstruktor SalinKonstruktor PindahDaftar Inisialisasi KonstruktorKonstruktor DelegasiKupas Tuntas DestruktorAturan Tiga, Lima, dan NolRangkuman: class String6Overloading Operator
Pengantar Overloading OperatorOverloading Operator AritmetikaOverloading Operator PerbandinganOperator StreamOverloading Operator PenugasanOverloading Operator [] dan ()Operator Konversi TipeRingkasan, class Matrix9Template
Template FungsiTemplate classSpesialisasi TemplateTemplate VariadikDasar SFINAE & Type TraitsRangkuman, Container GenerikLatihan sendiri: Compiler C++ online