Bài giảng Ngôn ngữ lập trình C - Bài 6: Kế thừa
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() ??
23 trang |
Chia sẻ: dntpro1256 | Lượt xem: 681 | Lượt tải: 0
Bạn đang xem trước 20 trang tài liệu Bài giảng Ngôn ngữ lập trình C - Bài 6: Kế thừa, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Bài 6: Kế thừaKhái niệm kế thừaKế 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ầnVí 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ừaVí dụ 2:Xây dựng ba lớp sau:Lớp ngườiLớp SinhVienLớp GiaoVienNGƯỜIDl: ht, ns, gtPt: nhap(),in()SVDl: ht, ns, gtPt: nhap(), in(), xếp loại()GVDl: ht, ns, gtPt: nhap(), in(), tangluong()Khái niệm kế thừaKế 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.PS1PS2NGƯỜISVGVKhái niệm kế thừaCá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ở.CPS1PS2ABXây dựng lớp dẫn xuấtclass :[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ápVí dụVí dụXây dựng lớp dẫn xuấtTrong đó: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.protectedprivate (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ấtprivateprotectedpublicprivateprivateprivateprivateprotectedprivateprotectedprotectedpublicprivateprotectedpublic(1)(2)Quyền truy xuất ở lớp conCác thành viên protectedCá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ừaconstructorsdestructorsfriend functionsoverloaded new operatorsoverloaded = operatorsClass friendship is not inheritedVí dụXây dựng lớp số phứcGồm: phần thực, phần ảoPhương thức: nhập, inXây dựng lớp SP1 kế thừa lớp SPBổ sung: +, -, *Hàm main:Nhập 2 số phức a,b. Tính và in a+b, a*b, modulHà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 chaThứ tự gọi: Hàm khởi tạo lớp cha Hàm khởi tạo lớp conVí 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 ([tham số]):([tham số]){}Hàm hủyHàm huỷ của lớp cơ sở không được kế thừaCác hàm huỷ được thi hành theo trình tự ngược lại so với hàm khởi tạoHà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ừaKhái niệmLà 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à Bh.D::n là thuộc tính n khai báo trong Dh.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 Dh.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ở ảoclass D : public B , public C{public: int d;} ;void main(){D h ;h.d = 4 ; // tốth.c = 3 ; // tốth.b = 2 ; // tốth.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ở ảoclass D : public B , public C{public: int d;} ;void main(){D h ;h.d = 4 ; // tốth.c = 3 ; // tốth.b = 2 ; // tốth.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 Aclass A{public: int a;} ; class B : virtual public A{public: int b;} ;class C : virtual public A{public: int c;} ;
Các file đính kèm theo tài liệu này:
- bai6_kethua_9512_1877389.pptx