Bài giảng Lập trình hướng đối tượng - Chương 4: Đa hình

Các đặc điểm quan trọng của LTHĐT

Giới thiệu

Các ví dụ

Phương thức ảo

Đa hình

Destructor ảo

Lớp cơ sở trừu tượng

 

ppt60 trang | Chuyên mục: Lập Trình Hướng Đối Tượng | Chia sẻ: dkS00TYs | Lượt xem: 1637 | Lượt tải: 2download
Tóm tắt nội dung Bài giảng Lập trình hướng đối tượng - Chương 4: Đa hình, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
Chương 4 ĐA HÌNH Nội dung chính Các đặc điểm quan trọng của LTHĐT Giới thiệu Các ví dụ Phương thức ảo Đa hình Destructor ảo Lớp cơ sở trừu tượng Tài liệu đọc Ví dụ 1 class Base { 	public: 	 void show( ) 	 { 	cout > c; 	if (c=='t') ptr=&t1; 	 else ptr=&p1; 	ptr->print();	// which print? 	return 0; } Ví dụ 3 Ví dụ 3 (tt) Ví dụ 3 (tt) Ví dụ 3 (tt) Ràng buộc/Liên kết Ràng buộc/Liên kết Sự xác định phương thức nào trong một phân cấp lớp được gọi với một đối tượng cụ thể Ràng buộc tĩnh/sớm Chương trình dịch có thể xác định được phương thức nào được gọi trong một phân cấp lớp với một đối tượng cụ thể Ràng buộc động/trễ Sự xác định phương thức nào trong một phân cấp lớp được sử dụng với một đối tượng cụ thể xảy ra trong thời điểm thực thi chương trình Giải thích kết quả của các ví dụ Ví dụ 1 pb là con trỏ trỏ đến đối tượng thuộc lớp cơ sở Base (Base *pb) Ví dụ 2 ptr là con trỏ trỏ đến đối tượng thuộc lớp cơ sở Teacher (Teacher *ptr) Ví dụ 3 ani là con trỏ trỏ đến đối tượng thuộc lớp cơ sở Animal (Animal *ani) Giải thích kết quả của các ví dụ (tt) Ví dụ 1 pb=&d1; pb=&d2; pb vẫn là trỏ đến đối tượng thuộc lớp Base (không quan tâm đến nội dung) Ví dụ 2 Tương tự ptr vẫn là trỏ đến đối tượng thuộc lớp Teacher Ví dụ 3 Tương tự ani vẫn là trỏ đến đối tượng thuộc lớp Animal Lý do Ràng buộc tĩnh/sớm Giải pháp: Ràng buộc động Chương trình dịch không thể xác định được sự ràng buộc của đối tượng và phương thức Ràng buộc này chỉ được xác định một cách động tại thời điểm thực thi chương trình Để xác định một phương thức bị ràng buộc động, ở khai báo phương thức của lớp cơ sở phải dùng từ khóa virtual Khi một phương thức được định nghĩa ảo, tất cả các phương thức phải nạp chồng từ điểm này xuống phân cấp lớp cho dù nó có được khai báo là tường minh hay không Các kết quả mới Ví dụ 1 virtual void show( ); Kết quả: Derv 1 Derv 2 Ví dụ 2 virtual void print() const; Kết quả: … Name of School: School Ví dụ 3 virtual void Speak() Kết quả: My name is Tony, go go ! My name is fluffy, meoo ! Phương thức ảo Giả sử lớp cơ sở Base có phương thức ảo method và các lớp dẫn xuất của Base nạp chồng phương thức này. Khi ta gọi method thông qua một con trỏ hay tham chiếu p có kiểu Base thì phương thức method được gọi sẽ là phương thức của đối tượng mà p đang trỏ đến Chú ý: Gọi phương thức method trên một đối tượng kiểu Base sẽ không có hiệu quả như đã nói ở trên Đa hình Ví dụ: Drawing tool Rectangle Triangle Ellipse Chúng ta muốn chúng làm gì ? Shape* shapes[10] Đặt chúng vào một thùng chứa tổng quát và … Rectangle Triangle Ellipse Chúng ta muốn chúng làm gì ? Shape* shapes[10] ... Điều kiển chúng bằng cách gửi cùng một thông điệp “draw” CharScreen s(20,10); for (i = 0; i draw(s); } “draw” “draw” Chúng ta muốn chúng làm gì ? Shape* shapes[10] Nhưng, làm sao để draw() mỗi đối tượng theo các cách khác nhau... “draw” void Rectangle::draw() { // draw a rectangle... } void Triangle::draw() { // draw a triangle... } void Ellipse::draw() { // draw an ellipse... } “draw” “draw” Đa hình (tt) Do vậy, mặc dù tên của thông điệp là giống nhau (như draw()) nhưng các đối tượng nhận thông điệp sẽ đáp ứng theo các cách khác theo kiểu đối tượng của nó (như Rectangle::draw(), Triangle::draw(), Ellipse::draw()). Điều này gọi là đa hình Một số ví dụ Một số ví dụ (tt) Một số ví dụ (tt) Một số ví dụ (tt) Thêm lớp mới Thêm lớp mới (tt) Cách làm việc của đa hình Ứng dụng đa hình Chú ý với phương thức ảo Phương thức ảo trong lớp cơ sở thường được nạp chồng trong các lớp dẫn xuất Đặt từ khóa virtual trong lớp cơ sở và nên đặt virtual cho cả phương thức trong lớp dẫn xuất Nếu lớp dẫn xuất không định nghĩa lại phương thức ảo của lớp cơ sở, nó sẽ sử dụng phương thức của lớp cơ sở Không thể khai báo constructor là phương thức ảo Có thể (và rất nên) khai báo destructor là phương thức ảo Destructor ảo The destructor must be declared virtual so that polymorphism can be achieved when a delete statement is applied to a base class pointer to delete a derived class object A base class destructor should always be declared virtual if at least one other function in the class is declared virtual Ví dụ: Destructot ảo Animal *ani=new Cat(“Buddy”); delete ani; //Destructor của lớp Animal sẽ //được gọi //Destructor của lớp Cat không được gọi Nếu khai báo destructor của Cat và Animal là virtual thì destructor của Cat sẽ được gọi Animal *ani=new Cat(“Buddy”); delete ani; //Destructor của lớp Cat được gọi //Sau đó đến destructor của lớp Animal Hỏi và Đáp 

File đính kèm:

  • pptBài giảng Lập trình hướng đối tượng - Chương 4 Đa hình.ppt