1. Trang chủ
  2. » Công Nghệ Thông Tin

tính kế thừa trong lập trình c++

39 422 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 39
Dung lượng 246,23 KB

Nội dung

Bài 13: Tính thừa kế Giảng viên: Hoàng Thị Điệp Khoa Công nghệ Thông tin – ĐH Công Nghệ Thuật ngữ • • • • • inheritance: tính thừa kế derive: dẫn xuất / thừa kế base/parent class: lớp sở / lớp cha derived/child class: lớp dẫn xuất / lớp override: che khuất (khác overload) – function overriding khác function overloading • multiple inheritance: đa thừa kế DTH INT2202 Chapter 14 Inheritance Copyright © 2010 Pearson Addison-Wesley. All rights reserved Day 12 Inheritance DTH INT2202 Mục tiêu học • Căn tính thừa kế – – – – Lớp dẫn xuất hàm kiến tạo Từ khóa protected Định nghĩa lại hàm thành viên Những hàm không thừa kế • Lập trình tính thừa kế – Toán t gán hàm kiến tạo chép – Hàm hủy lớp dẫn xuất – Đa thừa kế DTH INT2202 Giới thiệu tính thừa kế • Lập trình hướng đối tượng – Kĩ thuật lập trình mạnh – Cung cấp chế trừu tượng gọi thừa kế • Trước tiên định nghĩa dạng tổng quát lớp – Sau định nghĩa dạng cụ thể thừa kế thuộc tính dạng tổng quát – Và bổ sung/chỉnh sửa tính cho phù hợp với dạng cụ thể DTH INT2202 Căn tính thừa kế • Một lớp thừa kế từ lớp khác • Lớp sở – lớp “tổng quát” để lớp khác dẫn xuất • Lớp dẫn xuất – lớp – tự động từ lớp sở: • biến thành viên • hàm thành viên – thêm hàm biến thành viên riêng DTH INT2202 Lớp dẫn xuất • Xét ví dụ: lớp biểu diễn động vật Mammal • Lớp bao gồm: chó (Dog), mèo (Cat), ngựa (Horse), … • Mỗi loài tập lớp động vật DTH INT2202 Lớp sở • Một vật phải thuộc loài lớp động vật • Động vật nói chung – có tuổi đời (itsAge) – có cân nặng (itsWeight) – có khả kêu (speak), ngủ (sleep) • Như lớp tổng quát Mammal chứa thuộc tính chung cho tất động vật DTH INT2202 Lớp Mammal • Nhiều hàm/biến thành viên lớp động vật Mammal sử dụng cho tất loài – Hàm truy cập biến thành viên – Hàm biến đổi biến thành viên – Các biến • tuổi đời • cân nặng • Tuy nhiên ta không tạo đối tượng thuộc lớp Mammal DTH INT2202 10 Từ khóa định quyền truy cập: protected • Phân loại cho thành viên lớp • Cho phép lớp dẫn xuất truy cập trực tiếp thành viên lớp sở “bằng tên” – Nhưng với chỗ khác, chúng giống private • Trong lớp sở  coi chúng private • Chúng coi "protected" lớp dẫn xuất – Để cho phép dẫn xuất cháu chắt • Nhiều người cho chế vi phạm nguyên lý che giấu thông tin DTH INT2202 24 Định nghĩa lại hàm thành viên • Giao diện lớp dẫn xuất: – chứa khai báo hàm thành viên – khai báo hàm thành viên thừa kế cần thay đổi – Hàm thành viên thừa kế y nguyên không cần khai báo • Cài đặt lớp dẫn xuất: – định nghĩa hàm thành viên – định nghĩa lại hàm thừa kế khai báo DTH INT2202 25 Phân biệt: Định nghĩa lại nạp chồng • Rất khác nhau! • Định nghĩa lại lớp dẫn xuất: – Còn gọi che khuất – Danh sách tham số giống hệt hàm sở – Về viết lại hàm • Nạp chồng: – Danh sách tham số khác – Định nghĩa hàm với tham số khác – Các hàm nạp chồng phải có chữ kí khác DTH INT2202 26 Chữ kí hàm • Chữ kí gồm: – Tên hàm – Liệt kê kiểu liệu danh sách tham số • gồm thứ tự, số lượng, kiểu • Chữ kí không bao gồm: – Kiểu trả – Từ khóa const –& DTH INT2202 27 Truy cập tới hàm sở định nghĩa lại • Hàm sở bị định nghĩa lại không • Ví dụ bên minh họa cách gọi tới nó: Mammal tom; Dog snoopy; tom.speak();  gọi tới hàm speak() Mammal snoopy.speak();  gọi tới hàm speak() Dog snoopy.Mammal::speak();  gọi tới hàm speak() Mammal DTH INT2202 28 Những hàm không thừa kế • Mọi hàm chuẩn lớp sở lớp dẫn xuất thừa kế • Ngoại trừ: – Hàm kiến tạo (ta tìm hiểu) – Hàm hủy – Hàm kiến tạo chép • Nếu không định nghĩa sinh tự động hàm mặc định • Cần định nghĩa có biến thành viên private kiểu trỏ – Toán t gán • Nếu không định nghĩa  sinh tự động hàm mặc định DTH INT2202 29 Toán t gán hàm kiến tạo chép • Toán t gán nạp chồng hàm kiến tạo chép không thừa kế – Nhưng gọi định nghĩa lớp dẫn xuất – Người ta thường làm cách – Tương tự cách hàm kiến tạo lớp dẫn xuất gọi tới hàm kiến tạo sở DTH INT2202 30 Ví dụ toán tử gán • Dog dẫn xuất từ Mammal: Dog& Dog::operator =(const Dog& rightSide) { Mammal::operator =(rightSide); … } • Chú ý dòng code gọi tới toán tử gán lớp sở – Nó xử lý tất công việc liên quan tới biến thành viên thừa kế – Sau lời gọi nên tiếp tục xử lý biến thành viên riêng lớp dẫn xuất DTH INT2202 31 Ví dụ hàm kiến tạo chép • Xét hàm: Dog::Dog(const Dog& object): Mammal(object), … {…} • Sau dấu hai chấm lời gọi tới hàm kiến tạo chép sở – Lập giá trị biến thành viên thừa kế từ lớp sở cho đối tượng kiến tạo lớp dẫn xuất – Chú ý object có kiểu Dog có kiểu Mammal nên đối số lời gọi hợp lệ DTH INT2202 32 Hàm hủy lớp dẫn xuất • Nếu hàm hủy lớp sở hoạt động xác – dễ viết hàm hủy cho lớp dẫn xuất • Khi hàm hủy lớp dẫn xuất gọi: – chương trình tự động gọi hàm hủy lớp sở – Do không cần gọi tường minh • Vậy hàm hủy dẫn xuất cần quan tâm tới biến thành viên riêng lớp dẫn xuất – liệu chúng trỏ tới (nếu có) – hàm hủy sở tự đông xử lý liệu thừa kế DTH INT2202 33 Thứ tự gọi hàm hủy • Xét: lớp B dẫn xuất từ lớp A lớp C dẫn xuất từ lớp B A BC • Khi đối tượng thuộc lớp C phạm vi hoạt động: – Đầu tiên hàm hủy C gọi – Sau hàm hủy B gọi – Cuối hàm hủy A gọi • Ngược với thứ tự gọi hàm kiến tạo DTH INT2202 34 Quan hệ “IS A" "HAS A” • Thừa kế xem quan hệ "IS A” – Chó động vật (Mammal  Dog) – Ô tô xe (Vehicle  Car) – Xe tải xe (Vehicle  Truck) • Một lớp chứa biến thành viên có kiểu định nghĩa lớp khác xem quan hệ “HAS A” – Trang trại có chó, mèo ngựa (Farm có biến thành viên kiểu Dog, Cat Horse) DTH INT2202 35 Thừa kế protected private • Là dạng thừa kế – sử dụng • Thừa kế protected: class Cat: protected Mammal {…} – Các thành viên public lớp sở trở thành protected lớp dẫn xuất • Thừa kế private: class Horse: private Mammal {…} – Tất thành viên lớp sở trở thành private lớp dẫn xuất DTH INT2202 36 Đa thừa kế • Lớp dẫn xuất có lớp sở – Cú pháp liệt kê tên lớp sở (tách dấu phẩy): class Mule: public Donkey, Horse {…} • Nhiều khả nhập nhằng. • Nguy hiểm sử dụng! – Một vài người cho không nên dùng đa thừa kế – Chỉ nên dùng lập trình viên kinh nghiệm. DTH INT2202 37 Tóm tắt • Thừa kế cho phép dùng lại mã – Cho phép lớp dẫn xuất từ lớp khác bổ sung tính riêng • Đối tượng lớp dẫn xuất thừa kế thành viên lớp sở – bổ sung thành viên • Trong lớp dẫn xuất, truy cập tên tới biến thành viên private lớp sở • Hàm thành viên private không thừa kế DTH INT2202 38 Tóm tắt • Có thể định nghĩa lại hàm thành viên thừa kế – Để hoạt động khác hàm sở • Thành viên protected lớp sở: – Có thể truy cập tên hàm thành viên lớp dẫn xuất • Toán t gán nạp chồng không thừa kế – Nhưng gọi lớp dẫn xuất • Hàm kiến tạo không thừa kế – Được gọi từ hàm kiến tạo lớp dẫn xuất DTH INT2202 39 [...]... thành viên kiểu Dog, Cat và Horse) DTH INT2202 35 Thừa kế protected và private • Là dạng thừa kế mới – hiếm khi sử dụng • Thừa kế protected: class Cat: protected Mammal {…} – Các thành viên public của lớp cơ sở trở thành protected trong lớp dẫn xuất • Thừa kế private: class Horse: private Mammal {…} – Tất cả các thành viên trong lớp cơ sở trở thành private trong lớp dẫn xuất DTH INT2202 36 ... thành viên speak() – phiên bản cài đặt nó trong Dog sẽ “che khuất” phiên bản cài đặt trong Mammal • Do đó nó phải được khai báo lại trong giao diện lớp Dog – giống như những hàm thành viên mới bổ sung cho Dog • Giao diện gồm thành viên mới và thành viên “cần định nghĩa lại” DTH INT2202 17 Thuật ngữ liên quan đến tính thừa kế • Mô phỏng quan hệ gia đình • Lớp cha – lớp cơ sở • Lớp con – lớp dẫn xuất • Lớp... lớp dẫn xuất • Lớp dẫn xuất không thừa kế hàm kiến tạo của lớp cơ sở – Nhưng chúng có thể được gọi từ hàm kiến tạo của lớp dẫn xuất • Đây là tất cả những gì ta cần • Hàm kiến tạo của lớp cơ sở phải khởi tạo tất cả các biến thành viên của lớp cơ sở – Lớp dẫn xuất sẽ thừa kế các biến này – Vì vậy hàm kiến tạo của lớp dẫn xuất sẽ gọi tới hàm này • Việc đầu tiên cần làm trong hàm kiến tạo của lớp cơ sở... private • Chúng được coi là "protected" trong lớp dẫn xuất – Để cho phép các dẫn xuất cháu chắt • Nhiều người cho rằng cơ chế này vi phạm nguyên lý che giấu thông tin DTH INT2202 24 Định nghĩa lại hàm thành viên • Giao diện của lớp dẫn xuất: – chứa khai báo các hàm thành viên mới – và khai báo các hàm thành viên thừa kế nhưng cần thay đổi – Hàm thành viên thừa kế y nguyên thì không cần khai báo • Cài... cả công việc liên quan tới những biến thành viên được thừa kế – Sau lời gọi đó nên tiếp tục xử lý các biến thành viên của riêng lớp dẫn xuất DTH INT2202 31 Ví dụ hàm kiến tạo sao chép • Xét hàm: Dog::Dog(const Dog& object): Mammal(object), … {…} • Sau dấu hai chấm là lời gọi tới hàm kiến tạo sao chép cơ sở – Lập giá trị các biến thành viên thừa kế từ lớp cơ sở cho đối tượng đang kiến tạo của lớp dẫn... DTH INT2202 14 Giao diện lớp Dog • Nếu chia chương trình thành nhiều tệp – – – – main.cpp, Mammal.h, Mammal.cpp, Dog.h, Dog.cpp thì bạn cần bổ sung cấu trúc #ifndef và khai báo các thư viện cần thiết Trong main.cpp, khai báo “Dog.h” • Dòng đầu của lớp Dog: class Dog: public Mammal – xác định nó thừa kế public từ lớp Mammal DTH INT2202 15 Các thuộc tính bổ sung của lớp Dog • Giao diện của lớp dẫn xuất... những thành viên khác thừa kế từ lớp cơ sở đã được định nghĩa rồi – nghĩa là, mọi con chó đều có itsAge và itsWeight • Lớp Dog bổ sung: – hàm kiến tạo – biến thành viên itsBreed – hàm thành viên getBreed(), setBreed(), wagTail(), begForFood() DTH INT2202 16 Hàm thành viên được định nghĩa lại trong Dog • Lớp Dog đã định nghĩa lại: – hàm thành viên speak() – phiên bản cài đặt nó trong Dog sẽ “che khuất”... đã tự đông xử lý các dữ liệu được thừa kế DTH INT2202 33 Thứ tự gọi hàm hủy • Xét: lớp B dẫn xuất từ lớp A lớp C dẫn xuất từ lớp B A BC • Khi đối tượng thuộc lớp C ra ngoài phạm vi hoạt động: – Đầu tiên hàm hủy C được gọi – Sau đó hàm hủy B được gọi – Cuối cùng hàm hủy A được gọi • Ngược với thứ tự gọi hàm kiến tạo DTH INT2202 34 Quan hệ “IS A" và "HAS A” • Thừa kế được xem là quan hệ "IS A” – Chó... gọi tới hàm speak() của Mammal snoopy.speak();  gọi tới hàm speak() của Dog snoopy.Mammal::speak();  gọi tới hàm speak() của Mammal DTH INT2202 28 Những hàm không được thừa kế • Mọi hàm chuẩn của lớp cơ sở đều được lớp dẫn xuất thừa kế • Ngoại trừ: – Hàm kiến tạo (ta đã tìm hiểu) – Hàm hủy – Hàm kiến tạo sao chép • Nếu không định nghĩa sẽ được sinh tự động 1 hàm mặc định • Cần định nghĩa nếu có biến... Toán t ử gán • Nếu không định nghĩa  được sinh tự động 1 hàm mặc định DTH INT2202 29 Toán t ử gán và hàm kiến tạo sao chép • Toán t ử gán nạp chồng và hàm kiến tạo sao chép không được thừa kế – Nhưng có thể được gọi trong các định nghĩa của lớp dẫn xuất – Người ta thường làm cách này – Tương tự cách hàm kiến tạo của lớp dẫn xuất gọi tới hàm kiến tạo cơ sở DTH INT2202 30 Ví dụ toán tử gán • Dog được . function overloading • multiple inheritance: đa thừa kế DTH INT2202 2 Chapter 14 Inheritance Copyright © 2010 Pearson Addison-Wesley. All rights reserved Day 12 Inheritance DTH 4INT2202 Mục tiêu. 13: Tính thừa kế Giảng viên: Hoàng Thị Điệp Khoa Công nghệ Thông tin – ĐH Công Nghệ Thuật ngữ • inheritance: tính thừa kế • derive: dẫn xuất / thừa kế • base/parent class: lớp cơ sở / lớp cha •

Ngày đăng: 13/09/2015, 22:57

TỪ KHÓA LIÊN QUAN

w