Đa kế thừa C++

Kế thừa là một trong những khái niệm quan trọng nhất của Lập trình hướng đối tượng (OOP). Đó là khả năng của một lớp kế thừa hoặc dẫn xuất các thuộc tính từ một lớp khác. Kế thừa nâng cao khả năng đọc mã và cho phép người dùng sử dụng lại mã thay vì viết lặp đi lặp lại. Để hiểu khái niệm thừa kế, bạn phải tìm hiểu về hai thuật ngữ mà chúng dựa trên toàn bộ khái niệm thừa kế và sẽ được nhắc đến rất nhiều mỗi khi có thảo luận về thừa kế. Hai thuật ngữ này là

  • Lớp dẫn xuất hoặc Lớp con. Lớp kế thừa các thuộc tính và đặc điểm của lớp khác được gọi là lớp dẫn xuất
  • Lớp Cơ Sở hoặc Lớp Phụ Huynh. Lớp có các thuộc tính được kế thừa bởi lớp dẫn xuất được gọi là lớp cơ sở

Chủ yếu có năm loại kế thừa trong C++, chúng được đề cập bên dưới

  • Kế thừa đơn trong C++
  • Đa kế thừa trong C++
  • Kế thừa đa cấp trong C++
  • Kế thừa phân cấp trong C++
  • Kế thừa hỗn hợp trong C++

Đa kế thừa trong C++

Đa kế thừa trong C++ là một trong năm loại kế thừa được cung cấp trong C++, nơi bạn có thể lấy một lớp từ nhiều lớp. Điều này có nghĩa là một lớp dẫn xuất có thể có nhiều hơn một lớp cơ sở. Để hiểu rõ về Đa kế thừa trong C++, hãy xem xét đoạn mã dưới đây

lớp cha

{

// chứa các đặc điểm của người cha

};

lớp mẹ

{

//chứa các thuộc tính của mẹ

};

lớp con. cha công, mẹ công

{

công cộng

// định nghĩa lớp

};

Đoạn mã trên biểu thị mối quan hệ của một đứa trẻ với mẹ và cha của nó. Một đứa trẻ thừa hưởng các đặc điểm của cả cha và mẹ, chẳng hạn như chiều cao, màu da và các đặc điểm di truyền khác. Tương tự, lớp cha và lớp mẹ đều chứa một số thông tin mà lớp con kế thừa. Vì vậy, lớp con là lớp dẫn xuất của lớp cha và lớp mẹ

Cú pháp thực hiện đa kế thừa trong C++

Cú pháp sau đây có thể đạt được Đa kế thừa trong C++

lớp cơ sở_class_1

{

// định nghĩa lớp

}

lớp cơ sở_class_2

{

// định nghĩa lớp

}

lớp dẫn xuất lớp. access_modifier cơ sở_class_1, access_modifier cơ sở_class_2

{

// định nghĩa lớp

}

Mô tả cú pháp

  • access_modifier. Nó cung cấp công cụ sửa đổi truy cập trong khai báo lớp vì nó chỉ định cách lớp dẫn xuất kế thừa lớp cơ sở
  • cơ sở_class. Có thể có hơn một lớp cơ sở, từ đó lớp dẫn xuất kế thừa các thuộc tính của nó
  • Lớp có nguồn gốc. Đây là lớp dẫn xuất có thể kế thừa nhiều lớp cơ sở bằng cách sử dụng cùng một bộ xác định quyền truy cập khác nhau

Chế độ hiển thị trong Đa kế thừa trong C++

Chế độ hiển thị chỉ định quyền kiểm soát đối với các thành viên được kế thừa trong các lớp dẫn xuất. Một lớp có thể kế thừa một lớp cơ sở trong ba chế độ hiển thị

  • Chế độ hiển thị công khai

Trong chế độ hiển thị công khai, các thành viên công khai và được bảo vệ của lớp cơ sở được kế thừa bởi lớp dẫn xuất giữ lại các chỉ định truy cập của chúng. Điều này có nghĩa là các thành viên công cộng vẫn công khai và các thành viên được bảo vệ cũng vẫn được bảo vệ. Lớp dẫn xuất có thể truy cập trực tiếp các thành viên này. Tuy nhiên, các thành viên private của lớp cơ sở không thể truy cập trực tiếp vào lớp dẫn xuất

lớp cơ sở_class_1

{

// các thành viên trong lớp

}

lớp cơ sở_class_2

{

// các thành viên trong lớp

}

lớp dẫn xuất lớp. cơ sở_lớp_1 công khai, cơ sở_lớp_2 công khai

{

// thành viên base_class_1 và base_class_2

// công khai trở thành công khai

// được bảo vệ trở thành được bảo vệ

}

  • Chế độ hiển thị được bảo vệ

Trong chế độ hiển thị được bảo vệ, lớp dẫn xuất kế thừa các thành viên công khai và được bảo vệ của lớp cơ sở trong chế độ được bảo vệ. Điều này có nghĩa là các thành viên public và protected của lớp cha trở thành protected. Và nó không kế thừa các thành viên riêng tư và do đó không thể truy cập trực tiếp.  

  • Chế độ hiển thị riêng tư

Trong chế độ hiển thị riêng tư, nó kế thừa các thành viên của lớp cơ sở một cách riêng tư. Điều này có nghĩa là các thành viên công khai và được bảo vệ của lớp cơ sở trở thành riêng tư đối với lớp dẫn xuất. Các thành viên này bây giờ chỉ có thể được truy cập bởi các hàm thành viên của lớp dẫn xuất. Và vì các thành viên riêng tư không thể được kế thừa, nên nó cũng không thể kế thừa các thành viên này nữa

lớp cơ sở_class_1

{

// các thành viên trong lớp

}

lớp cơ sở_class_2

{

// các thành viên trong lớp

}

lớp dẫn xuất lớp. base_class_1 được bảo vệ, base_class_2 riêng tư

{

// cơ_sở_lớp_1

// public được bảo vệ

// được bảo vệ trở thành được bảo vệ

// cơ_sở_lớp_2

// các thành viên không được kế thừa

}

Biểu đồ sau đây tóm tắt sự kiểm soát của các lớp dẫn xuất đối với các thành viên của lớp cơ sở trong các chế độ hiển thị khác nhau

LỚP CÓ NGUỒN GỐC

LỚP CÓ NGUỒN GỐC

LỚP CÓ NGUỒN GỐC

LỚP CƠ SỞ

CÔNG CỘNG

BẢO VỆ

RIÊNG

CÔNG CỘNG

Công cộng

được bảo vệ

Riêng tư

BẢO VỆ

được bảo vệ

được bảo vệ

Riêng tư

RIÊNG

Không được kế thừa / Vẫn ở chế độ riêng tư

Không được kế thừa / Vẫn ở chế độ riêng tư

Không được kế thừa / Vẫn ở chế độ riêng tư

Nổi bật so với các đồng nghiệp của bạn trong mùa đánh giá này

Bắt đầu học với các khóa học MIỄN PHÍ của chúng tôi Đăng ký ngay

Ưu điểm của đa kế thừa trong C++

  1. Đa kế thừa trong C++ cho phép một lớp dẫn xuất kế thừa nhiều thuộc tính và đặc điểm hơn do nó có nhiều lớp cơ sở
  2. Nó chứng tỏ là có lợi để thiết kế các mẫu thiết kế khác nhau. Một số mẫu này là
  1. Mẫu bộ điều hợp. Mẫu này được sử dụng khi bạn cần thích ứng với giao diện khác với lớp của mình. Đối với điều này, Đa kế thừa trong C ++ đóng một vai trò lớn trong việc hoán đổi giao diện này với giao diện khác
  2. mẫu người quan sát. Mẫu này được sử dụng để duy trì danh sách người quan sát bằng cách tạo một lớp

Vấn đề kim cương đáng sợ

Sự cố kim cương đáng sợ xảy ra khi có cấu trúc lớp tương tự như sau.  

2 lớp cha của Derived_class_3 là Derived_class_1 và Derived_class_2 có chung một lớp cơ sở i. e. lớp cơ sở. Vì vậy, sẽ có 2 bản sao của tất cả các thuộc tính của Base_class. Khi bạn tạo một đối tượng của lớp dẫn xuất Derived_class_3, nó chứa hai bản sao của Base_class. Tình huống này có thể gây ra sự mơ hồ. Xem xét ví dụ sau để hiểu tình huống kim cương đáng sợ này

#include

sử dụng không gian tên std;

// lớp cơ sở

lớp Cơ sở_class

{

công cộng

intx;

// constructor của lớp cơ sở

Lớp cơ sở()

{

cout

Chủ đề