Dalam C ++ kelas dapat mewarisi (secara langsung atau tidak langsung) dari lebih dari satu kelas, yang disebut sebagai
warisan berganda .
C # dan Java, bagaimanapun, membatasi kelas ke satu warisan yang diwarisi setiap kelas dari kelas induk tunggal.
Beberapa pewarisan adalah cara yang berguna untuk membuat kelas yang menggabungkan aspek dari dua hierarki kelas yang berbeda, sesuatu yang sering terjadi saat menggunakan kerangka kelas yang berbeda dalam satu aplikasi.
Jika dua kerangka kerja menentukan kelas dasarnya sendiri untuk pengecualian, misalnya, Anda dapat menggunakan beberapa pewarisan untuk membuat kelas pengecualian yang dapat digunakan dengan salah satu kerangka kerja.
Masalah dengan multiple inheritance adalah hal itu dapat menyebabkan ambiguitas. Contoh klasiknya adalah ketika sebuah kelas mewarisi dari dua kelas lainnya, yang masing-masing mewarisi dari kelas yang sama:
class A {
protected:
bool flag;
};
class B : public A {};
class C : public A {};
class D : public B, public C {
public:
void setFlag( bool nflag ){
flag = nflag; // ambiguous
}
};
Dalam contoh ini, flag
anggota data ditentukan oleh class A
. Tapi class D
turun dari class B
dan class C
, yang keduanya berasal dari A
, jadi pada dasarnya dua salinan dari flag
yang tersedia karena dua contoh A
dalam D
hirarki kelas 's. Mana yang mau Anda setel? Kompilator akan mengeluh bahwa referensi ke flag
dalam D
bersifat ambigu . Salah satu cara memperbaikinya adalah dengan menguraikan referensi secara eksplisit:
B::flag = nflag;
Perbaikan lainnya adalah dengan mendeklarasikan B dan C sebagai virtual base classes
, yang berarti bahwa hanya satu salinan A yang dapat berada dalam hierarki, menghilangkan ambiguitas.
Kompleksitas lain ada dengan beberapa pewarisan, seperti urutan di mana kelas dasar diinisialisasi saat objek turunan dibangun, atau cara anggota dapat secara tidak sengaja disembunyikan dari kelas turunan. Untuk menghindari kerumitan ini, beberapa bahasa membatasi diri pada model pewarisan tunggal yang lebih sederhana.
Meskipun ini sangat menyederhanakan pewarisan, kegunaannya juga terbatas karena hanya kelas dengan leluhur yang sama yang dapat berbagi perilaku. Antarmuka mengurangi pembatasan ini dengan mengizinkan kelas dalam hierarki yang berbeda untuk mengekspos antarmuka umum meskipun tidak diimplementasikan dengan berbagi kode.