C++ hỗ trợ đa kế thừa trong lập trình hướng đối tượng

Đây là bài 15/19 bài của series môn học Lập trình hướng đối tượng

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.

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++ >>
Chia sẻ trên mạng xã hội:

Trả lời

Lưu ý:

1) Vui lòng bình luận bằng tiếng Việt có dấu.

2) Khuyến khích sử dụng tên thật và địa chỉ email chính xác.

3) Mọi bình luận trái quy định sẽ bị xóa bỏ.