Bài giảng Lập trình hướng đối tượng - Bài 6: Kế thừa - Phạm Thị Bích Vân

Khái niệm kế thừa

Kế thừa là khả năng cho phép xây dựng một lớp mới:

Được thừa hưởng các thành phần từ một hay nhiều lớp đã có (lớp cơ sở).

Trong lớp ta có thể bổ sung thêm các thành phần hoặc định nghĩa lại các thành phần

Ví dụ.

Xây dựng lớp PS1 {ts, ms, nhập, in, tối giản}

Lớp PS2 {ts, ms, nhập, in, tối giản, cộng, trừ, nhân chia phân số}

 

pptx 23 trang yennguyen 3860
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Lập trình hướng đối tượng - Bài 6: Kế thừa - Phạm Thị Bích Vân", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

Tóm tắt nội dung tài liệu: Bài giảng Lập trình hướng đối tượng - Bài 6: Kế thừa - Phạm Thị Bích Vân

Bài giảng Lập trình hướng đối tượng - Bài 6: Kế thừa - Phạm Thị Bích Vân
Bài 6: Kế thừa 
Khái niệm kế thừa 
Kế thừa là khả năng cho phép xây dựng một lớp mới: 
Được thừa hưởng các thành phần từ một hay nhiều lớp đã có (lớp cơ sở). 
Trong lớp ta có thể bổ sung thêm các thành phần hoặc định nghĩa lại các thành phần 
Ví dụ. 
Xây dựng lớp PS1 {ts, ms, nhập, in, tối giản} 
Lớp PS2 {ts, ms, nhập, in, tối giản, cộng, trừ, nhân chia phân số} 
Khái niệm kế thừa 
Ví dụ 2: 
Xây dựng ba lớp sau: 
Lớp người 
Lớp SinhVien 
Lớp GiaoVien 
NGƯỜI 
Dl: ht, ns, gt 
Pt: nhap (),in () 
SV 
Dl: ht, ns, gt 
Pt: nhap(), in(), xếp loại() 
GV 
Dl: ht, ns, gt 
Pt: nhap(), in(), tangluong() 
Khái niệm kế thừa 
Kế thừa tạo ra mô hình phân cấp: 
Lớp được kế thừa: Lớp cơ sở, lớp cha. 
Lớp kế thừa: Lớp dẫn xuất, lớp con. 
PS1 
PS2 
NGƯỜI 
SV 
GV 
Khái niệm kế thừa 
Các loại kế thừa: 
Đơn kế thừa: chỉ có một lớp cơ sở 
Đa kế thừa: có nhiều hơn một lớp cơ sở . 
C 
PS1 
PS2 
A 
B 
Xây dựng lớp dẫn xuất 
class :[kiểu dẫn xuất] 
	,[kiểu dẫn xuất] 
	.. 
{ 
// Các thành phần của lớp con 
}; 
Cú pháp 
Ví dụ 
Ví dụ 
Xây dựng lớp dẫn xuất 
Trong đó: 
Kiểu dẫn xuất có thể là: 
public 
 public : tất cả các tp public của lớp cha sẽ là public ở lớp con. 
 private : tất cả các thành phần public của lớp cha sẽ là private ở lớp con 
 Kiểu dẫn xuất mặc đinh là private. 
protected 
private (ngầm định) 
Xây dựng lớp dẫn xuất 
 Kế thừa các thuộc tính: 
 Các thuộc tính của lớp cơ sở được kế thừa trong lớp dẫn xuất. 
 Trong lớp dẫn xuất không cho phép truy nhập đến các thuộc tính private của lớp cơ sở. 
 Cho phép đặt tên các thuộc tính trùng. 
 Kế thừa phương thức: 
 Trừ: Hàm tạo, hàm hủy, toán tử gán. 
Quyền truy xuất. 
(1) Quyền truy xuất tp đó ở lớp cha : 
(2) Kiểu dẫn xuất 
private 
protected 
public 
private 
private 
private 
private 
protected 
private 
protected 
protected 
public 
private 
protected 
public 
(1) 
(2) 
Quyền truy xuất ở lớp con 
Các thành viên protected 
Các thành viên public của một lớp cơ sở. 
Các thành viên private của một lớp cơ sở. 
Các thành viên protected của một lớp cơ sở chỉ được truy cập bởi các hàm thành viên và các hàm bạn của lớp cơ sở và lớp dẫn xuất. 
Xây dựng lớp dẫn xuất 
Định nghĩa lại thành viên của lớp cơ sở ở lớp dẫn xuất: 
Lớp dẫn xuất có thể định nghĩa lại hàm thành viên của lớp cơ sở (gọi là ghi đè). 
Muốn gọi hàm của lớp cơ sở, dùng toán tử định phạm vi (: :) 
Ví dụ: 
Void SinhVien::Nhap() 
{ 
	Nguoi::Nhap(); 
	cin>>nganh; 
} 
. 
Các thành phần không kế thừa 
constructors 
destructors 
friend functions 
overloaded new operators 
overloaded = operators 
Class friendship is not inherited 
Ví dụ 
Xây dựng lớp số phức 
Gồm: phần thực, phần ảo 
Phương thức: nhập, in 
Xây dựng lớp SP1 kế thừa lớp SP 
Bổ sung: +, -, * 
Hàm main: 
Nhập 2 số phức a,b. Tính và in a+b, a*b, modul 
Hàm khởi tạo 
- Hàm khởi tạo của lớp cha không được kế thừa 
- Mỗi đối tượng của lớp con có thể coi là một đối tượng của lớp cha 
=> khi gọi hàm khởi tạo của lớp con sẽ kéo theo gọi hàm khởi tạo của lớp cha 
Thứ tự gọi: 
	Hàm khởi tạo lớp cha Hàm khởi tạo lớp con 
Ví dụ 
class DIEM 
{ 
private: 
	double x, y; 
public: 
DIEM() 
{ 
	x = y =0.0; 
} 
DIEM(double x1, double y1) 
{ 
	x = x1; y = y1; 
} 
void in() 
{ 
	cout << "\nx= " << x << " y= " << y; 
} 
}; 
class HINH_TRON : public DIEM 
{ 
private: 
	double r; 
public: 
HINH_TRON() 
{ 
r = 0.0; 
} 
HINH_TRON(double x1, double y1, 
double r1): DIEM(x1,y1) 
{ 
	r = r1; 
} 
} 
Hàm khởi tạo 
Nếu xây dựng hàm khởi tạo của lớp con: 
Phải gọi hàm khởi tạo của lớp cha tường minh 
Cú pháp: 
Chú ý: 
Hàm khởi tạo lớp cơ sở thực hiện trước 
Nếu lớp dẫn xuất có nhiều lớp cơ sở thì trình tự thực hiện tuân theo trình tự kế thừa. 
([tham số]):([tham số]) 
{ 
} 
Hàm hủy 
Hàm huỷ của lớp cơ sở không được kế thừa 
Các hàm huỷ được thi hành theo trình tự ngược lại so với hàm khởi tạo 
Hàm huỷ của lớp dẫn xuất thi hành trước hàm huỷ của lớp cơ sở 
Đa kế thừa 
Khái niệm 
Là khả năng xây dựng lớp dẫn xuất kế thừa từ nhiều hơn một lớp cơ sở 
Đa kế thừa có thể là tính năng rất mạnh nhưng đôi khi gây ra một số vấn đề 
Sử dụng các thành phần trong lớp dẫn xuất 
 Thành phần của lớp dẫn xuất gồm: 
 Các thành phần khai báo trong lớp dẫn xuất 
 Các thành phần mà lớp dẫn xuất thừa kế từ các lớp cơ sở 
 Quy tắc sử dụng các thành phần trong lớp dẫn xuất: 
 Cách 1: Dùng tên lớp và tên thành phần (C++ dễ phân biệt thành phần của lớp nào) 
	 D h; // h là đối tượng của lớp D dẫn xuất từ A và B 
h.D::n là thuộc tính n khai báo trong D 
h.A::n là thuộc tính n thừa kế từ A (khai báo trong A) 
h.D::nhap() là phương thức nhap() định nghĩa trong D 
h.A::nhap() là phương thức nhap() định nghĩa trong A 
 Cách 2: Không dùng tên lớp, chỉ dùng tên thành phần 
	 Vấn đề: C kế thừa từ A,B. Trong A,B đều có phương thức nhap(). Khi gọi C.nhap() ?? 
Các lớp cơ sở ảo 
class D : public B , public C 
{ 
public: 
	int d; 
} ; 
void main() 
{ 
D h ; 
h.d = 4 ; // tốt 
h.c = 3 ; // tốt 
h.b = 2 ; // tốt 
h.a = 1 ; // lỗi do không biết a là thừa kế thông qua B hay C 
} 
 Một lớp có thể là lớp cơ sở của nhiều lớp. 
 Xét ví dụ sau: 
class A 
{ 
public: 
	int a; 
} ; 
class B : public A 
{ 
public: 
	int b; 
} ; 
class C : public A 
{ 
public: 
	int c; 
} ; 
Các lớp cơ sở ảo 
class D : public B , public C 
{ 
public: 
	int d; 
} ; 
void main() 
{ 
D h ; 
h.d = 4 ; // tốt 
h.c = 3 ; // tốt 
h.b = 2 ; // tốt 
h.a = 1 ; // OK 
} 
 Giải pháp 
 Khai báo A là lớp cơ sở ảo. Khi đó A là lớp cơ sở duy nhất của A 
class A 
{ 
public: 
	int a; 
} ; 
class B : virtual public A 
{ 
public: 
	int b; 
} ; 
class C : virtual public A 
{ 
public: 
	int c; 
} ; 

File đính kèm:

  • pptxbai_giang_lap_trinh_huong_doi_tuong_bai_6_ke_thua_pham_thi_b.pptx