Penjelasan Diamond Inheritance (Warisan Berlian)

Posted on   Mei 28, 2019   |   Last Modified   Mei 28, 2019
diamond inheritance

Multiple Inheritance

Pada artikel sebelumnya mengenai “Penjelasan Inheritance” telah ditegaskan bahwa C++ memungkinkan untuk melakukan banyak Pewarisan (Inheritance) dari banyak base class ke satu derived class.

Dalam hal ini, pewarisan juga bisa memiliki kasus seperti, derived class mendapatkan warisan dari dua base class, dan kenyataannya base class tersebut sebelumnya juga mendapakan warisan dari satu base class.

Contoh Program:

#include <iostream>
using namespace std;

class orang{
    public:
    int umur;

    orang(int pUmur):
        umur(pUmur)
        {
            cout<<"orang dibuat dengan umur "<<umur<<"\n"<<endl;
    }
};

class pekerja: public orang{
    public:

    pekerja(int pUmur):
        orang(pUmur)
        {
            cout<<"pekerja dibuat\n"<<endl;
    }
};

class pelajar: public orang{
    public:

    pelajar(int pUmur):
        orang(pUmur)
        {
            cout<<"pelajar dibuat\n"<<endl;
    }
};

class budi: public pekerja, public pelajar{
    public:

    budi(int pUmur):
        pekerja(pUmur),
        pelajar(pUmur)
        {
            cout<<"Budi dibuat\n"<<endl;
    }
};

int main(){
    budi a(12);

    return 0;
}

Pada program di atas dicontohkan bahwa class budi mendapatkan warisan dari class pekerja dan pelajar.

Dan di saat itu juga, class pekerja dan pelajar mendapatkan warisan dari class orang yang sama.

Pada program di atas memang berjalan dengan baik. Tapi di beberapa kasus, program di atas dapat dinilai buruk karena terdapat “ambiguitas”.

Untuk membuktikan mari kita lihat hasil yang dihasilkan oleh contoh program di atas.


orang dibuat dengan umur 12
pekerja dibuat
orang dibuat dengan umur 12
pelajar dibuat
Budi dibuat

Hasil dari program di atas membuktikan adanya “ambiguitas”, dimana class orang dipanggil sebanyak dua kali oleh dua class yang berbeda. Berikut adalah visualisasi dari masalah ini:

Diamond Inheritance tanpa Virtual
Diamond Inheritance tanpa Virtual

Hal itu bisa menjadi masalah besar, untuk mengatasi masalah tersebut kita dapat melakukan teknik “Diamond Inheritance” atau jika dalam bahasa Indonesia adalah “Warisan berlian”.

Teknik “Diamond inheritance” Dengan Virtual Inheritance

Kita dapat memecahkan masalah di atas menggunakan teknik Diamond inheritance, dengan menghiangkan masalah “ambiguitas”. Berikut adaah visualisasi yang akan kita dapatkan ketika menggunakan teknik “Diamond inheritance”:

Baca :   Penjelasan dan Kegunaan Final Specifier
Diamond Inheritance dengan Virtual
Diamond Inheritance dengan Virtual

Pada relasi gambar di atas hanya akan memiliki satu class orang.

Untuk melakukan Diamond inhetitance kita membutuhkan keyword virtual untuk membuat Virtual inheritance.

Contoh Program:

#include <iostream>
using namespace std;

class orang{
    public:
    int umur;

    orang(int pUmur):
        umur(pUmur)
        {
            cout<<"orang dibuat dengan umur "<<umur<<"\n"<<endl;
    }
};

class pekerja: virtual public orang{ //ditambahkan virtual
    public:

    pekerja(int pUmur):
        orang(pUmur)
        {
            cout<<"pekerja dibuat\n"<<endl;
    }
};

class pelajar: virtual public orang{ //ditambahkan virtual
    public:

    pelajar(int pUmur):
        orang(pUmur)
        {
            cout<<"pelajar dibuat\n"<<endl;
    }
};

class budi: public pekerja, public pelajar{
    public:

    budi(int pUmur):
        pekerja(pUmur),
        pelajar(pUmur),
        orang(pUmur) //hal ini dapat dilakukan jika menggunakan virtual
        {
            cout<<"Budi dibuat\n"<<endl;
    }
};

int main(){
    budi a(12);

    return 0;
}

Contoh program di atas merupakan program yang sama dengan contoh program pertama, hanya ditambahkan keyword virtual pada pewarisan class orang. Dari program di atas menyelesaikan masalah “ambiguitas” pada class orang dan membuat relasi dengan teknik “ Diamond inheritance”.


orang dibuat dengan umur 12
pekerja dibuat
pelajar dibuat
Budi dibuat

Tambahan:

Program sebelum tidak menggunakan virtual dan kita tidak dimungkinkan untuk memanggil contructor dari class kakek-nenek (orang), yang bisa kita lakukan hanya memanggilnya melalui class orang tua (pekerja dan pelajar). Tapi di saat menggunakan virtual, kita dimungkinkan memanggil constructor dari class kakek-nenek secara langsung.


Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *