C++ Hỗ Trợ đa Kế Thừa Trong Lập Trình Hướng đối Tượng - Góc Học IT

1. Đa kế thừa (multiple inheritance) là gì?

Lớp dẫn xuất kế thừa từ nhiều lớp cơ sở gọi là đa kế thừa trong C++.

Multiple inheritance in c++
Cú pháp:
class Lớp_Cơ_Sở_1{ //Định nghĩa lớp cơ sở 1 }; class Lớp_Cơ_Sở_2{ //Định nghĩa lớp cơ sở 2 }; class Lớp_Dẫn_Xuất : <Từ_khóa_dẫn_xuất> Lớp_Cơ_Sở_1, <Từ_khóa_dẫn_xuất> Lớp_Cơ_Sở_2{ //Định nghĩa lớp dẫn xuất }

<Từ_khóa_dẫn_xuất> có thể là private, public hoặc protected. Các bạn có thể đọc lại bài Dẫn xuất public, protected, private trong kế thừa và minh họa với C++ để hiểu rõ về các từ khóa dẫn xuất này.

Lớp dẫn xuất có thể kế thừa từ nhiều hơn 2 lớp cơ sở. Nhưng khi sử dụng các bạn nên cân nhắc cẩn thận, không nên lạm dụng đa kế thừa trong C++. Bởi vì khi kế thừa từ quá nhiều lớp sẽ dẫn đến rối rắm cho chính lập trình viên.#include <iostream> using namespace std; class base1{ private: int x1; protected: float y1; public: void nhap1(){ cout<<"\nNhap gia tri x1:"; cin>>x1; } }; class base2{ private: int x2; public: void nhap2(){ cout<<"\nNhap gia tri x2:"; cin>>x2; } }; class derived : public base1, public base2{ private: int x; public: void nhap(){ cout<<"\nNhap gia tri x:"; cin>>x; } }; void main(){ derived obj; system("pause"); }

Trong ví dụ trên, lớp dẫn xuất derived kế thừa public từ lớp base1base2 sẽ có:

x1, x2 không thể truy cập trong lớp derived.

x là thuộc tính private của lớp derived.

y1 là thuộc tính protected của lớp derived.

nhap1(), nhap2(), nhap() là các hàm public của lớp derived.

2. Lời gọi hàm mơ hồ khi sử dụng đa kế thừa trong C++

Có trường hợp 2 lớp cơ sở có hàm trùng tên với nhau, hàm này không được định nghĩa lại trong lớp dẫn xuất. Nếu đối tượng của lớp dẫn xuất gọi hàm đó thì trình biên dịch sẽ báo lỗi.

Trình biên dịch không biết là đối tượng của lớp dẫn xuất muốn gọi hàm trong lớp cơ sở nào. Hiện tượng này gọi là lời gọi hàm mơ hồ (ambiguity).#include <iostream> using namespace std; class base1{ private: int x1; protected: float y1; public: void nhap(){ cout<<"\nNhap gia tri x1:"; cin>>x1; } }; class base2{ private: int x2; public: void nhap(){ cout<<"\nNhap gia tri x2:"; cin>>x2; } }; class derived : public base1, public base2{ }; void main(){ derived obj; obj.nhap();//error "derived::nhap" is ambiguous system("pause"); }

Để giải quyết vấn đề này, chúng ta phải chỉ rõ đang gọi hàm của lớp cơ sở nào.

  • Giả lập điều khiển đèn tín hiệu giao thông có nút bấm với Arduino
  • Sử dụng kiểu dữ liệu số (number) trong PHP
  • Các kiểu dữ liệu cơ bản trong C++
  • Java collections framework: lớp Vector và lớp Stack
  • Lớp FileReader và FileWriter trong Java
void main(){ derived obj; obj.base1::nhap();//gọi hàm nhap() của lớp base1 obj.base2::nhap();//gọi hàm nhap() của lớp base2 system("pause"); } 5/5 - (1 bình chọn)Bài trước và bài sau trong môn học<< Lớp dẫn xuất (derived class) trong lập trình hướng đối tượng với C++Hàm ảo (virtual function) trong lập trình hướng đối tượng với C++ >>

Từ khóa » đa Xạ Trong C++