Ada beberapa masalah dengan pewarisan berganda ketika digunakan dengan kelas penuh penuh, tetapi mereka semua berputar di sekitar ambiguitas .
Ambiguitas muncul dalam beberapa cara berbeda:
- Jika Anda memiliki dua kelas dasar dengan bidang yang sama
x
, dan tipe turunan meminta x
, apa yang didapatnya?
- Jika dua
x
variabel memiliki tipe yang tidak sesuai, Anda bisa menyimpulkannya.
- Jika jenisnya sama, Anda bisa mencoba menggabungkannya ke dalam variabel yang sama.
- Anda selalu bisa mengekspos mereka sebagai nama yang memenuhi syarat aneh dan aneh.
- Jika Anda memiliki dua kelas dasar dengan fungsi yang sama
f
dengan tanda tangan identik, dan seseorang memanggil f
, yang dipanggil?
- Bagaimana jika dua kelas dasar berbagi leluhur virtual yang sama (masalah berlian).
- Bagaimana jika fungsi tersebut memiliki tanda tangan yang berbeda tetapi kompatibel?
- Ketika Anda membangun kelas dengan dua kelas dasar, yang mana dari konstruktor kelas dasar disebut pertama? Ketika Anda menghancurkan objek, yang terbunuh?
- Ketika Anda meletakkan objek dalam memori, bagaimana Anda melakukannya secara konsisten?
- Bagaimana Anda menangani semua kasus ini dengan 3 kelas dasar? 10?
Dan itu mengabaikan hal-hal seperti pengiriman dinamis, inferensi ketik, pencocokan pola, dan hal-hal lain yang kurang saya ketahui yang menjadi lebih menantang ketika bahasa mendukung banyak pewarisan kelas penuh.
Ciri atau Campuran (atau antarmuka, atau ...) adalah semua konstruksi yang secara khusus membatasi kemampuan jenis sehingga tidak ada ambiguitas. Mereka jarang memiliki apa pun sendiri. Ini memungkinkan komposisi tipe menjadi lebih lancar karena tidak ada dua variabel atau dua fungsi ... ada variabel dan referensi; fungsi dan tanda tangan. Kompiler tahu apa yang harus dilakukan.
Pendekatan umum lainnya yang diambil adalah memaksa pengguna untuk "membangun" (atau mencampur) tipe mereka satu per satu. Alih-alih kelas dasar menjadi mitra yang sama dalam tipe baru, Anda menambahkan satu tipe ke yang lain - menimpa apa pun yang ada di sana (biasanya dengan sintaks opsional untuk menamai ulang dan / atau mengekspos ulang bit yang diganti).
Apakah ada sesuatu yang tidak mungkin dengan mixin / traits tetapi mungkin dengan C ++ - style multiple inheritance?
Tergantung pada bahasanya - umumnya menjadi merepotkan atau tidak mungkin untuk menggabungkan implementasi fungsi dan penyimpanan untuk variabel dari beberapa kelas dasar dan mengeksposnya dalam tipe turunan.
Apakah mungkin mengalami masalah berlian dengan mereka?
Terkadang variasi yang kurang parah akan muncul berdasarkan bahasa Anda, tetapi biasanya tidak. Seluruh sifat dari sifat-sifat tersebut adalah untuk memecahkan ambiguitas semacam itu.