Menu
CoddyTech

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.

challenge icon

Tantangan

Mudah

Mari 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 dasar Notifier dengan:
    • Anggota std::string recipient yang dilindungi
    • Konstruktor yang menerima nama penerima dan menyimpannya
    • Method publik send(const std::string& message) yang mencetak: Sending to <recipient>: <message>
  • EmailNotifier.h: Definisikan class EmailNotifier yang mewarisi Notifier secara publik:
    • Konstruktor yang menerima penerima dan meneruskannya ke class dasar
    • Override method send() dengan memanggil versi class dasar terlebih dahulu menggunakan Notifier::send(), lalu mencetak: [Email sent successfully]
  • main.cpp: Baca dua input (masing-masing pada baris terpisah):
    1. Nama penerima (string)
    2. Isi pesan (string)

    Definisikan class SMSNotifier langsung di main.cpp yang mewarisi Notifier secara 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, dan SMSNotifier) menggunakan penerima yang sama. Panggil send() 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;
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Object

Latihan sendiri: Compiler C++ online