En belirgin sorun, işlevin geçersiz kılınmasıdır.
Diyelim ki iki sınıfımız var A
ve B
her ikisi de bir yöntemi tanımlıyor doSomething
. Şimdi üçüncü bir sınıfını tanımlamak C
hem, devralır A
ve B
fakat geçersiz kılmaz doSomething
yöntemi.
Derleyici bu kodu tohumladığında ...
C c = new C();
c.doSomething();
... yöntemin hangi uygulamasını kullanmalıdır? Daha fazla açıklama yapılmadan derleyicinin belirsizliği çözmesi imkansızdır.
Geçersiz kılmanın yanı sıra, çoklu kalıtımla ilgili diğer büyük sorun, fiziksel nesnelerin bellekteki düzenidir.
C ++, Java ve C # gibi diller, her nesne türü için sabit bir adres tabanlı düzen oluşturur. Bunun gibi bir şey:
class A:
at offset 0 ... "abc" ... 4 byte int field
at offset 4 ... "xyz" ... 8 byte double field
at offset 12 ... "speak" ... 4 byte function pointer
class B:
at offset 0 ... "foo" ... 2 byte short field
at offset 2 ... 2 bytes of alignment padding
at offset 4 ... "bar" ... 4 byte array pointer
at offset 8 ... "baz" ... 4 byte function pointer
Derleyici makine kodu (veya bayt kodu) ürettiğinde, her yönteme veya alana erişmek için bu sayısal uzaklıkları kullanır.
Çoklu miras, işi çok zorlaştırır.
Sınıf ise C
hem devralır A
ve B
, derleyici veri düzeni karar vermek vardır AB
sırayla veya BA
sırayla.
Ama şimdi bir B
nesnede yöntemleri çağırdığınızı hayal edin . Gerçekten sadece bir B
mi? Yoksa arayüzü C
aracılığıyla polimorfik olarak adlandırılan bir nesne B
mi? Nesnenin gerçek kimliğine bağlı olarak, fiziksel düzen farklı olacaktır ve çağrı yerinde çalıştırılacak işlevin ofsetini bilmek imkansızdır.
Bu tür bir sistemi ele almanın yolu, sabit yerleşim yaklaşımından vazgeçmek, her nesnenin işlevleri çağırmadan veya alanlarına erişmeden önce düzeni için sorgulanmasına izin vermektir .
Yani ... uzun lafın kısası ... derleyici yazarların çoklu mirası desteklemesi baş belasıdır. Yani Guido van Rossum gibi biri python tasarladığında veya Anders Hejlsberg c # tasarladığında, çoklu mirası desteklemenin derleyici uygulamalarını önemli ölçüde daha karmaşık hale getireceğini biliyorlar ve muhtemelen faydanın maliyete değdiğini düşünmüyorlar.