Çoklu kalıtım, bir sınıfın birden fazla üst sınıfın arayüzünü ve implementasyonunu miras almasına olanak tanır. Bu, C++’ın güçlü bir özelliğidir ve karmaşık mimarilerin gerçekleştirilmesi için dilin ilk günlerinden beri yaygın olarak kullanılmıştır.
Konu Tarihi: Çoklu kalıtım, C++’da tekrar kullanılabilir bileşenler oluşturmanın ve bir sınıfta farklı rollerin birleştirilmesinin bir aracı olarak eklenmiştir (örneğin, bir nesne hem bir akış hem de bir kuyruk olduğunda).
Sorun: Çoklu kalıtımda başlıca zorluklar 'elmas problemi' (diamond problem), üst sınıfların üyelerine erişimde belirsizlik ve yapıcıların / yıkıcıların çağrılma sırasının belirsizliğidir.
Çözüm: Bahsedilen sorunların önlenmesi için C++’da sanal kalıtım (virtual inheritance) öngörülmüştür. Bu, ortak bir atasının yalnızca bir kez oluşturulmasını garanti eder, hatta hiyerarşi boyunca ona giden birden fazla zincir olsa bile, ve doğru bir başlatma/yok etme sırasını sağlar.
Kod örneği:
class A { public: int value; A() : value(1) {} }; class B : virtual public A {}; class C : virtual public A {}; class D : public B, public C {}; int main() { D d; d.value = 10; // TAMAM, yalnızca bir A return 0; }
Anahtar özellikler:
Eğer bir üst sınıf iki kez miras alındıysa (soldan ve sağdan), nesnede bu sınıfın kaç kopyası olacak?
Varsayılan olarak iki, eğer sanal kalıtım kullanılmıyorsa. yalnızca sanal kalıtım kullanıldığında tam olarak bir kopya olacaktır.
Üyeye yapılan çağrıda belirsizlik oluştuğunda, hangi üst sınıfa ait olduğunu açıkça belirtebilir miyiz?
Evet, niteliklerle belirterek:
d.B::value = 5; d.C::value = 6;
Birden fazla kalıtım durumunda yapıcıların ve yıkıcıların çağrılma sırası nasıl belirlenir?
Yapıcıların çağrılma sırası, üst sınıfların kalıtım listesinde belirtilme sırasına (soldan sağa) göre belirlenir, ardından türetilmiş sınıf gelir. Yıkıcılar için ise bunun tersidir.
Bir programcı, çoklu kalıtım üzerinden bir günlükleme ve kuyruk sistemi uygulamakta ve elmas problemini fark etmemektedir. Sonuç olarak, ortak günlüğün iki kez başlatılması, kaynakların serbest bırakılmasında çakışmalara neden olur.
Artılar:
Eksiler:
Ortak günlük için sanal kalıtım kullanılır ve sınıf üyeleri yapıcıda açıkça başlatılır.
Artılar:
Eksiler: