Có một số vấn đề với nhiều kế thừa khi nó được sử dụng với các lớp đầy đủ, nhưng tất cả đều xoay quanh sự mơ hồ .
Sự mơ hồ hiện lên theo một vài cách khác nhau:
- Nếu bạn có hai lớp cơ sở với cùng một trường
x
và loại dẫn xuất yêu cầu x
, thì nó nhận được gì?
- Nếu hai
x
biến có loại không phù hợp, bạn có thể suy ra nó.
- Nếu chúng cùng loại, bạn có thể thử hợp nhất chúng vào cùng một biến.
- Bạn luôn có thể phơi bày chúng là những cái tên đủ điều kiện kỳ lạ.
- Nếu bạn có hai lớp cơ sở có cùng chức năng
f
với chữ ký giống hệt nhau và ai đó gọi f
, cái nào được gọi?
- Điều gì xảy ra nếu hai lớp cơ sở chia sẻ một tổ tiên ảo chung khác (vấn đề kim cương).
- Điều gì nếu chức năng có chữ ký khác nhau, nhưng tương thích?
- Khi bạn xây dựng một lớp với hai lớp cơ sở, hàm tạo nào của lớp cơ sở được gọi đầu tiên? Khi bạn tiêu diệt đối tượng, cái nào bị giết?
- Khi bạn bố trí đối tượng trong bộ nhớ, làm thế nào để bạn thực hiện nó một cách nhất quán?
- Làm thế nào để bạn xử lý tất cả các trường hợp này với 3 lớp cơ sở? 10?
Và điều đó bỏ qua những thứ như công văn động, suy luận kiểu, khớp mẫu và những thứ khác mà tôi biết ít hơn sẽ trở nên khó khăn hơn khi ngôn ngữ hỗ trợ nhiều kế thừa của các lớp đầy đủ.
Các đặc điểm hoặc Mix-in (hoặc giao diện hoặc ...) đều là các cấu trúc giới hạn cụ thể các khả năng của một loại để không có sự mơ hồ. Họ hiếm khi sở hữu bất cứ thứ gì. Điều này cho phép thành phần của các loại mượt mà hơn vì không có hai biến hoặc hai hàm ... có một biến và một tham chiếu; một chức năng và một chữ ký. Trình biên dịch biết phải làm gì.
Cách tiếp cận phổ biến khác được thực hiện là buộc người dùng "xây dựng" (hoặc trộn vào) loại một tại một thời điểm. Thay vì các lớp cơ sở là đối tác bình đẳng trong loại mới, bạn thêm một loại vào loại khác - ghi đè bất cứ thứ gì có ở đó (thường với cú pháp tùy chọn để đặt lại tên và / hoặc hiển thị lại các bit bị ghi đè).
Có điều gì đó không thể xảy ra với mixins / tính trạng nhưng có thể với đa thừa kế kiểu C ++ không?
Tùy thuộc vào ngôn ngữ - thường trở nên rắc rối hoặc không thể hợp nhất việc triển khai các hàm và lưu trữ cho các biến từ nhiều lớp cơ sở và phơi bày chúng trong loại dẫn xuất.
Có thể chạy vào vấn đề kim cương với họ?
Đôi khi các biến thể ít nghiêm trọng hơn sẽ bật lên dựa trên ngôn ngữ của bạn, nhưng thường thì không. Toàn bộ điểm của các đặc điểm là để phá vỡ sự mơ hồ đó.