C ++ 'da bir sınıf, birden fazla sınıftan (doğrudan veya dolaylı olarak) miras alabilir, bu da çoklu miras olarak adlandırılır.
.
Bununla birlikte, C # ve Java, sınıfları her sınıfın tek bir ana sınıftan miras aldığı tek mirasla sınırlar .
Çoklu miras, iki farklı sınıf hiyerarşisinin yönlerini birleştiren sınıflar oluşturmanın yararlı bir yoludur; bu, genellikle tek bir uygulamada farklı sınıf çerçeveleri kullanıldığında meydana gelen bir şeydir.
Örneğin, iki çerçeve istisnalar için kendi temel sınıflarını tanımlıyorsa, her iki çerçeveyle de kullanılabilen istisna sınıfları oluşturmak için çoklu miras kullanabilirsiniz.
Çoklu kalıtımla ilgili sorun, belirsizliğe yol açabilmesidir. Klasik örnek, bir sınıfın, her biri aynı sınıftan miras alan diğer iki sınıftan miras almasıdır:
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
}
};
Bu örnekte, flag
veri üyesi tarafından tanımlanmıştır class A
. Ama class D
gelen alçalır class B
ve class C
hem türetmek,A
bu yüzden özünde, iki kopya ait flag
iki örneğini çünkü mevcut A
olan D
bireyin sınıf hiyerarşisi. Hangisini ayarlamak istiyorsun? Derleyici referans şikayet edecektir flag
in D
olduğu belirsiz . Bir düzeltme, referansı açıkça belirsizleştirmektir:
B::flag = nflag;
Diğer bir düzeltme de B ve C'yi olarak bildirmektir virtual base classes
; bu, hiyerarşide herhangi bir belirsizliği ortadan kaldırarak yalnızca bir A kopyasının var olabileceği anlamına gelir.
Türetilmiş bir nesne oluşturulduğunda temel sınıfların başlatılma sırası veya üyelerin türetilmiş sınıflardan yanlışlıkla gizlenebilme şekli gibi çoklu mirasla ilgili diğer karmaşıklıklar mevcuttur. Bu karmaşıklıklardan kaçınmak için, bazı diller kendilerini daha basit tekli kalıtım modeliyle sınırlar.
Bu, kalıtımı önemli ölçüde basitleştirse de, aynı zamanda yararlılığını da sınırlar çünkü yalnızca ortak bir ataya sahip sınıflar davranışları paylaşabilir. Arabirimler, farklı hiyerarşilerdeki sınıfların ortak arabirimleri kod paylaşarak uygulanmasalar bile ortaya çıkarmasına izin vererek bu kısıtlamayı bir ölçüde azaltır.