Vấn đề rõ ràng nhất là với chức năng ghi đè.
Giả sử có hai lớp A
và B
cả hai đều xác định một phương thức doSomething
. Bây giờ bạn xác định một lớp thứ ba C
, lớp này kế thừa từ cả A
và B
, nhưng bạn không ghi đè doSomething
phương thức.
Khi trình biên dịch bắt nguồn mã này ...
C c = new C();
c.doSomething();
... nó nên sử dụng phương pháp thực hiện nào? Nếu không có bất kỳ giải thích rõ ràng nào, trình biên dịch không thể giải quyết sự mơ hồ.
Bên cạnh việc ghi đè, một vấn đề lớn khác với đa kế thừa là cách bố trí các đối tượng vật lý trong bộ nhớ.
Các ngôn ngữ như C ++, Java và C # tạo ra một bố cục dựa trên địa chỉ cố định cho từng loại đối tượng. Một cái gì đó như thế này:
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
Khi trình biên dịch tạo mã máy (hoặc mã bytecode), nó sử dụng các hiệu số đó để truy cập từng phương thức hoặc trường.
Việc thừa kế nhiều lần làm cho nó rất phức tạp.
Nếu lớp C
kế thừa từ cả hai A
và B
, trình biên dịch phải quyết định xem có nên bố trí dữ liệu trongAB
thứ tự hay theo BA
thứ tự.
Nhưng bây giờ hãy tưởng tượng rằng bạn đang gọi các phương thức trên một B
đối tượng. Nó thực sự chỉ là một B
? Hay nó thực sự là mộtC
đối tượng được gọi là đa hình, thông qua B
giao diện của nó ? Tùy thuộc vào nhận dạng thực tế của đối tượng, bố cục vật lý sẽ khác nhau và không thể biết được phần bù của hàm để gọi tại trang web gọi.
Cách để xử lý loại hệ thống này là loại bỏ cách tiếp cận bố cục cố định, cho phép từng đối tượng được truy vấn về bố cục của nó trước khi cố gắng gọi các hàm hoặc truy cập các trường của nó.
Vì vậy, ... truyện dài ngắn ... thật là đau đầu cho các tác giả biên dịch để hỗ trợ đa kế thừa. Vì vậy, khi ai đó như Guido van Rossum thiết kế python hoặc khi Anders Hejlsberg thiết kế c #, họ biết rằng việc hỗ trợ đa kế thừa sẽ làm cho việc triển khai trình biên dịch phức tạp hơn đáng kể và có lẽ họ không nghĩ rằng lợi ích đó xứng đáng với chi phí.