Bài giảng Lập trình hướng đối tượng - Chương 4: Sự kế thừa
lượt xem 8
download
Bài giảng Lập trình hướng đối tượng chương 4: Sự kế thừa trình bày về kế thừa đơn, phạm vi truy xuất, phương thức thiết lập và huỷ bỏ, con trỏ và kế thừa. Tham khảo tài liệu để nắm bắt nội dung môn học một cách chi tiết nhất.
Bình luận(0) Đăng nhập để gửi bình luận!
Nội dung Text: Bài giảng Lập trình hướng đối tượng - Chương 4: Sự kế thừa
- Chương 4 Sự kế thừa 1
- Nội dung 1. Mở đầu 2. Kế thừa đơn 3. Phạm vi truy xuất 4. Phương thức thiết lập và huỷ bỏ 5. Con trỏ và kế thừa 2
- 4.1 Mở đầu - Sự kế thừa là một đặc điểm của ngôn ngữ dùng để biểu diễn mối quan hệ đặc biệt giữa các lớp. Các lớp được trừu tượng hóa và tổ chức thành một sơ đồ phân cấp lớp. - Kế thừa là một cơ chế trừu tượng hóa. Thủ tục và hàm là cơ chế trừu tượng hóa cho giải thuật, record và struct là trừu tượng hóa cho dữ liệu. Khái niệm lớp trong C++, kết hợp dữ liệu và thủ tục để được kiểu dữ liệu trừu tượng với giao diện độc lập với cài đặt và cho người sử dụng cảm giác thoải mái như kiểu dữ liệu có sẵn - Sự kế thừa là một mức cao hơn của trừu tượng hóa. cung cấp một cơ chế gom chung các lớp có liên quan với nhau thành một mức khái quát hóa đặc trưng cho toàn bộ các lớp nói trên. Các lớp với các đặc điểm tương tự nhau có thể được tổ chức thành một sơ đồ phân cấp kế thừa. Lớp ở trên cùng là trừu tượng hóa của toàn bộ các lớp ỏ bên dưới 3
- Mở đầu Quan hệ là 1: Kế thừa được sử dụng thông dụng nhất để biểu diễn quan hệ là một. • Một sinh viên là một người • Một hình tròn là một hình ellipse • Một tam giác là một đa giác Kế thừa tạo khả năng xây dựng lớp mới từ lớp đã có, trong đó hàm thành phần được thừa hưởng từ lớp cha. Trong C++, kế thừa còn định nghĩa sự tương thích, nhờ đó ta có cơ chế chuyển kiểu tự động. Kế thừa vừa có khả năng tạo cơ chế khái quát hoá vừa có khả năng chuyên biệt hoá. Kế thừa cho phép tổ chức các lớp chia sẻ mã chương trình chung nhờ vậy có thể dễ dàng sửa chữa, nâng cấp hệ thống. 4
- Mở đầu Kế thừa thường được dùng theo hai cách: • Để phản ánh mối quan hệ giữa các lớp. Là công cụ để tổ chức và phân cấp lớp dựa vào sự chuyên biệt hóa, trong đó một vài hàm thành phần của lớp con là phiên bản hoàn thiện hoặc đặc biệt hoá của phiên bản ở lớp cha. Trong C++ mối quan hệ này thường được cài đặt sử dụng: Kế thừa public. Hàm thành phần là phương thức ảo • Để phản ánh sự chia sẻ mã chương trình giữa các lớp không có quan hệ về mặt ngữ nghĩa nhưng có thể có tổ chức dữ liệu và mã chương trình tương tự nhau. Trong C++, cơ chế chia sẻ mã này thường được cài đặt dùng: Kế thừa private. Hàm thành phần không là phương thức ảo. 5
- 4.2 Kế thừa đơn Kế thừa có thể được thực hiện để thể hiện mối quan hệ 'là một'. Xét hai khái niệm người và sinh viên với mối quan hệ tự nhiên: một 'sinh viên' là một 'người'. Trong C++, ta có thể biểu diễn khái niệm trên, một sinh viên là một người có thêm một số thông tin và một số thao tác (riêng biệt của sinh viên). Ta tổ chức lớp sinh viên kế thừa từ lớp người. Lớp người được gọi là lớp cha (superclass) hay lớp cơ sở (base class). Lớp sinh viên được gọi là lớp con (subclass) hay lớp dẫn xuất (derived class). 6
- Kế thừa đơn class Nguoi { friend class SinhVien; char *HoTen; int NamSinh; public: Nguoi(char *ht, int ns):NamSinh(ns) {HoTen = strdup(ht);} ~Nguoi() {delete [] HoTen;} void An() const { cout
- Kế thừa đơn class SinhVien : public Nguoi { char *MaSo; public: SinhVien(char *ht, char *ms, int ns) : Nguoi(ht,ns) { MaSo = strdup(ms);} ~SinhVien() {delete [] MaSo;} void Xuat() const; }; ostream& operator
- Kế thừa đơn void Nguoi::Xuat() const { cout
- Kế thừa đơn void main() { Nguoi p1("Le Van Nhan",1980); SinhVien s1("Vo Vien Sinh", "200002541",1984); cout
- Tự động kế thừa các đặc tính của lớp cha Khai báo class SinhVien : public Nguoi { //... }; Cho biết lớp sinh viên kế thừa từ lớp người. Khi đó sinh viên được thừa hưởng các đặc tính của lớp người. Về mặt dữ liệu: Mỗi đối tượng sinh viên tự động có thành phần dữ liệu họ tên và năm sinh của người. Về mặt thao tác: Lớp sinh viên được tự động kế thừa các thao tác của lớp cha. Đây chính là khả năng sử dụng lại mã chương trình. Riêng phương thức thiết lập không được kế thừa. 11
- Tự động kế thừa các đặc tính của lớp cha Nguoi p1("Le Van Nhan",1980); SinhVien s1("Vo Vien Sinh", "200002541",1984); p1.An(); cout
- Định nghĩa lại thao tác ở lớp con Ta có thể định nghĩa lại các đặc tính ở lớp con đã có ở lớp cha, việc định nghĩa chủ yếu là thao tác, bằng cách khai báo giống hệt như ở lớp cha. class SinhVien : public Nguoi { char *MaSo; public: //... void Xuat() const; }; void SinhVien::Xuat() const { cout
- Định nghĩa lại thao tác ở lớp con Việc định nghĩa lại thao tác ở lớp con được thực hiện khi thao tác ở lớp con khác thao tác ở lớp cha. Thông thường là các thao tác xuất, nhập. Ta cũng có thể định nghĩa lại thao tác ở lớp con trong trường hợp giải thuật ở lớp con đơn giản hơn (tô màu đa giác, tính modun của số ảo...). class DaGiac { // ... void Ve() const; void ToMau() const; }; class HCN { void ToMau() const; }; 14
- Định nghĩa lại thao tác ở lớp con Hoặc ở lớp con, thao tác không có tác dụng class Ellipse { //... public: //... void rotate(double rotangle){ //...} }; class Circle:public Ellipse { public: //... void rotate(double rotangle){/* do nothing */} }; 15
- 4.3 Ràng buộc ngữ nghĩa ở lớp con Kế thừa có thể được áp dụng cho quan hệ kế thừa mang ý nghĩa ràng buộc, đối tượng ở lớp con là đối tượng ở lớp cha nhưng có dữ liệu bị ràng buộc. • Hình tròn là Ellipse ràng buộc bán kính ngang dọc bằng nhau. • Số ảo là số phức ràng buộc phần thực bằng 0. • Hình vuông là hình chữ nhật ràng buộc hai cạnh ngang và dọc bằng nhau… Trong trường hợp này, các hàm thành phần phải bảo đảm sự ràng buộc dữ liệu được tôn trọng. Lớp số ảo sau đây là một ví dụ minh hoạ. 16
- Ràng buộc ngữ nghĩa ở lớp con class Complex { friend ostream& operator
- Ràng buộc ngữ nghĩa ở lớp con class Imag: public Complex { public: Imag(double i = 0):Complex(0, i){} Imag(const Complex &c) : Complex(0, c.im){} Imag& operator = (const Complex &c) {re = 0; im = c.im; return *this;} double Norm() const {return fabs(im);} }; void main() { Imag i = 1; Complex z1(1,1), z3 = z1 - i; // z3 = (1,0) i = Complex(5,2); // i la so ao (0,2) Imag j = z1; // j la so ao (0,1) cout
- Ràng buộc ngữ nghĩa ở lớp con Trong ví dụ trên lớp số ảo (Imag) kế thừa hầu hết các thao tác của lớp số phức (Complex). Tuy nhiên ta muốn ràng buộc mọi đối tượng thuộc lớp số ảo đều phải có phần thực bằng 0. Vì vậy phải định nghĩa lại các hàm thành phần có thể vi phạm điều này. Ví dụ phép toán gán phải được định nghĩa lại để bảo đảm ràng buộc này. class Imag: public Complex { public: //... Imag(const Complex &c) : Complex(0, c.im){} Imag& operator = (const Complex &c) {re = 0; im = c.im; return *this;} }; 19
- Ràng buộc ngữ nghĩa ở lớp con Ví dụ sau minh hoạ thêm ràng buộc ngữ nghĩa ở lớp con class HCN:public Hinh { Diem TrenTrai; double rong, cao; public: HCN(Diem tt, double r, double c); HCN(double ttx, double tty, double r, double c); HCN():TrenTrai(4,6), rong(7), cao(4){} virtual double DienTich() const {return rong*cao;} virtual void Nhap(); virtual void Xuat(); virtual void PhongTo(double tiLe); virtual void GianNgang(double tiLe); virtual void GianDoc(double tiLe); }; 20
CÓ THỂ BẠN MUỐN DOWNLOAD
-
Bài giảng Lập trình hướng đối tượng: Chương 1 - TS. Trần Công Án
57 p | 89 | 13
-
Bài giảng Lập trình hướng đối tượng: Chương 2 - Nguyễn Sơn Hoàng Quốc, ThS. Nguyễn Tấn Trần Minh Khang
14 p | 174 | 12
-
Bài giảng Lập trình hướng đối tượng - Chương 1: Phương pháp lập trình hướng đối tượng
9 p | 140 | 9
-
Bài giảng Lập trình hướng đối tượng C++ - Chương 2: Lập trình hướng đối tượng
53 p | 46 | 8
-
Bài giảng Lập trình hướng đối tượng (dùng Java): Chương 1 - Trần Minh Thái (2017)
55 p | 80 | 8
-
Bài giảng Lập trình hướng đối tượng - Bài 1: Tổng quan lập trình hướng đối tượng
53 p | 119 | 8
-
Bài giảng Lập trình hướng đối tượng (Dùng C#): Chương 2 - Trần Minh Thái
35 p | 103 | 8
-
Bài giảng Lập trình hướng đối tượng: Chương 1 - Trần Thị Anh Thi
7 p | 197 | 7
-
Bài giảng Lập trình hướng đối tượng: Bài 1 - ThS. Trịnh Thành Trung
53 p | 86 | 7
-
Bài giảng Lập trình hướng đối tượng: Chương 1 - Trần Minh Thái
40 p | 116 | 6
-
Bài giảng Lập trình hướng đối tượng 1: Chương 1 - ThS. Thái Kim Phụng
39 p | 100 | 6
-
Bài giảng Lập trình hướng đối tượng – Bài 01: Tổng quan về OOP
47 p | 63 | 5
-
Bài giảng Lập trình hướng đối tượng (dùng JAVA): Chương 1 - Trần Minh Thái
40 p | 99 | 5
-
Bài giảng Lập trình hướng đối tượng và C++: Chương 1
15 p | 103 | 4
-
Bài giảng Lập trình hướng đối tượng: Nhập môn - Trần Phước Tuấn
15 p | 139 | 4
-
Bài giảng Lập trình hướng đối tượng: Bài 1 - Tổng quan về lập trình hướng đối tượng
47 p | 11 | 4
-
Bài giảng Lập trình hướng đối tượng: Chương 1 - Các khái niệm cơ bản trong lập trình hướng đối tượng
36 p | 15 | 3
-
Bài giảng Lập trình hướng đối tượng: Bài 1 - Nguyễn Khanh Văn
0 p | 83 | 2
Chịu trách nhiệm nội dung:
Nguyễn Công Hà - Giám đốc Công ty TNHH TÀI LIỆU TRỰC TUYẾN VI NA
LIÊN HỆ
Địa chỉ: P402, 54A Nơ Trang Long, Phường 14, Q.Bình Thạnh, TP.HCM
Hotline: 093 303 0098
Email: support@tailieu.vn