Đa kế thừa là gì? Khi nào thì nó nên được sử dụng?

Ví dụ có lớp A, kế thừa từ B và C

Cả B và C đều có hàm Color() chẳng hạn.

A chưa có hàm Color() này.

Vậy khi 1 biến của A gọi hàm Color, thì nó sẽ gọi của B hay C ?

Làm sao để phân biệt được ?

6 Likes

Nếu bạn viết lớp nào trước thì lớp A sẽ kế thừa lớp đó trước
VD:

public class A:B,C
{
       ....
}

Trường hợp này thì A sẽ kế thừa hàm của B trước

3 Likes

Giờ mình muốn gọi hàm color của lớp B hoặc C thì phải làm sao?

2 Likes

bạn chỉ cần gọi trực tiếp hàm color thôi, bởi vì mình đã kế thừa r nên k cần gọi theo kiểu truyền cục bộ nữa.
VD:

interface B
{
       void color();
}
public class A:B
{
       public void color()
       {
              ...
       }
}
3 Likes

Theo mình nó sẽ như thế này (dùng hàm super)
public void colorB()
{
super();
}
Bạn gọi hàm colorB() từ class A thì thì nó sẽ gọi hàm color từ classB đấy

Người ta hỏi c++ mấy thánh rep bằng java.
em sẽ gặp lỗi sau nếu không khai báo gì.

error: request for member ‘color’ is ambiguous

muốn sử dụng đa kế thừa và dùng hàm color, em phải override:

class A: public B, public C {
     void color();
};

void A::color() {
  B::color();
  cout << "----" << endl;
  C::color();
}

Bổ sung thêm.
java, C# chỉ cho phép kế thừa từ 1 class và nhiều interface. khi đó method từ class đã implement, và từ interface thì chưa.
Nên gọi method từ class A mà chưa khai báo, mặc định nó là method của class. vì đã được implement.

5 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?