Dalam tutorial ini, kita menjelajahi pola warisan C++—ganda, multilevel, dan hierarkis—dengan contoh kode praktis.
Warisan adalah fitur dasar dari pemrograman berorientasi objek. Ini memungkinkan pengembang untuk membuat kelas baru yang mewarisi properti dan perilaku dari yang sudah ada.
Di bawah ini kita memeriksa tiga model warisan utama yang tersedia dalam C++.
Warisan Multilevel C++
Dalam hierarki multilevel, sebuah kelas diturunkan dari kelas turunan lainnya. Rantai berlanjut sampai mencapai kelas dasar.
class A { // Implementasi kelas dasar }; class B : public A { // B mewarisi dari A }; class C : public B { // C mewarisi dari B };
Di sini, B mewarisi dari A, dan C mewarisi dari B, membentuk rantai warisan vertikal.
Contoh 1: Warisan Multilevel dalam C++
#include <iostream> using namespace std; class A { public: void display() { cout << "Konten kelas dasar." << endl; } }; class B : public A {}; class C : public B {}; int main() { C obj; obj.display(); return 0; }
Output
Konten kelas dasar.
Program ini menunjukkan bahwa objek dari C dapat memanggil display() yang didefinisikan di kelas dasar akhir A karena tidak ada implementasi penggantian yang ada di B atau C. Kompiler menyelesaikan panggilan dengan mencari rantai warisan dari kelas turunan paling akhir ke atas.
Warisan Ganda C++
C++ memungkinkan sebuah kelas untuk mewarisi dari lebih dari satu kelas dasar. Misalnya, sebuah Bat dapat diturunkan dari baik Mammal dan WingedAnimal karena seekor kelelawar sekaligus adalah mamalia dan makhluk bersayap.
Contoh 2: Warisan Ganda dalam C++
#include <iostream> using namespace std; class Mammal { public: Mammal() { cout << "Mamalia dapat melahirkan langsung." << endl; } }; class WingedAnimal { public: WingedAnimal() { cout << "Makhluk bersayap dapat berkibar." << endl; } }; class Bat : public Mammal, public WingedAnimal {}; int main() { Bat b1; return 0; }
Output
Mamalia dapat melahirkan langsung. Makhluk bersayap dapat berkibar.
Mengatasi Ambiguitas dalam Warisan Ganda
Ketika dua kelas dasar menyediakan fungsi dengan nama yang sama, kompiler tidak dapat memutuskan mana yang akan dipanggil, yang mengakibatkan kesalahan ambiguitas.
class Base1 { public: void someFunction() { /* ... */ } }; class Base2 { public: void someFunction() { /* ... */ } }; class Derived : public Base1, public Base2 {}; int main() { Derived obj; // obj.someFunction(); // Kesalahan: ambigu }
Gunakan operator resolusi cakupan untuk menentukan fungsi kelas dasar yang diinginkan:
Dalam warisan hierarkis, beberapa kelas turunan mewarisi dari satu kelas dasar. Semua atribut dan perilaku umum dikapsulasi di kelas dasar, sementara setiap kelas turunan dapat menambahkan spesialisasi miliknya sendiri.
Contohnya meliputi Physics, Chemistry, dan Biology diturunkan dari Science; dan Dog, Cat, Horse diturunkan dari Animal.
Sintaks Warisan Hierarkis
class BaseClass { // Konten kelas dasar }; class DerivedOne : public BaseClass { // Anggota tambahan }; class DerivedTwo : public BaseClass { // Anggota tambahan }; class DerivedThree : public BaseClass { // Anggota tambahan };
Contoh 3: Warisan Hierarkis dalam C++
// Program C++ menunjukkan warisan hierarkis #include <iostream> using namespace std; // Kelas dasar class Animal { public: void info() { cout << "Saya adalah seekor hewan." << endl; } }; // Kelas turunan 1 class Dog : public Animal { public: void bark() { cout << "Saya adalah seekor Anjing. Guk guk." << endl; } }; // Kelas turunan 2 class Cat : public Animal { public: void meow() { cout << "Saya adalah seekor Kucing. Meong." << endl; } }; int main() { // Instance Anjing Dog dog1; cout << "Kelas Anjing:" << endl; dog1.info(); dog1.bark(); // Instance Kucing Cat cat1; cout << "\nKelas Kucing:" << endl; cat1.info(); cat1.meow(); return 0; }
Output
Kelas Anjing: Saya adalah seekor hewan. Saya adalah seekor Anjing. Guk guk. Kelas Kucing: Saya adalah seekor hewan. Saya adalah seekor Kucing. Meong.
Kedua Dog dan Cat mewarisi metode info() dari Animal, sementara setiap kelas memperkenalkan perilaku spesialisasi miliknya sendiri.