Tải bản đầy đủ (.doc) (3 trang)

6 dahinh

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (68.78 KB, 3 trang )

HỌC VIỆN KỸ THẬT QUÂN SỰ
KHOA CÔNG NGHỆ THÔNG TIN

ĐỀ CƯƠNG BÀI GIẢNG

HỌC PHẦN: LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
Bộ môn: Công nghệ phần mềm
Giáo viên: 1) Phạm Thị Bích Vân

Bài VI: Cơ chế đa hình
1. Thời lượng: 9 tiết (GV giảng: 3; bài tập: 3; thực hành: 3)
2. Mục đích, yêu cầu: Giới thiệu sinh viên khái niệm ý nghĩa của đa hình, cách tạo các phương thức ảo,
các lớp trừu tượng, và đa hình trong lập trình hướng đối tượng.
3. Nội dung:
a) Nội dung chi tiết:
• Giới thiệu


Tính đa hình (polymorphism) là khả năng thiết kế và cài đặt các hệ thống mà có thể mở rộng dễ



dàng hơn. Các chương trình có thể được viết để xử lý tổng quát – như các đối tượng lớp cơ sở –
các đối tượng của tất cả các lớp tồn tại trong một phân cấp.
Khả năng cho phép một chương trình sau khi đã biên dịch có thể có nhiều diễn biến xảy ra là



một trong những thể hiện của tính đa hình – tính muôn màu muôn vẻ – của chương trình hướng
đối tượng, một thông điệp được gởi đi (gởi đến đối tượng) mà không cần biết đối tượng nhận
thuộc lớp nào.


Phương thức ảo



Khi xây dựng các lớp của một chương trình hướng đối tượng để tạo nên một cấu trúc phân cấp



hoặc cây phả hệ, người lập trình phải chuẩn bị các hành vi giao tiếp chung của các lớp đó. Hành
vi giao tiếp chung sẽ được dùng để thể hiện cùng một hành vi, nhưng có các hành động khác
nhau, đó chính là phương thức ảo.
Ta khai báo phương thức ảo bằng thêm từ khóa virtual ở phía trước. Khi đó các phương thức có
cùng tên với phương thức này trong các lớp dẫn xuất cũng là phương thức ảo.
1: //Chương trình
2: #include <iostream.h>
3:
4: class Base
5: {
6: public:
7:
virtual void Display()
8:
{
9:
cout<<"class Base"<10:
}
11: };
12:
13: class Derived : public Base

14: {
15: public:
16:
virtual void Display()
17:
{
18:
cout<<"class Derived"<19:
}
20: };
21:
21: void Show(Base *B)
22: {
23:
B->Display(); //Con trỏ B chỉ đến phương thức Display() nào
(của lớp Base

Bộ môn Công nghệ phần mềm


24 //hoặc lớp Derived) tùy vào lúc chạy chương trình.
25: }
26: int main()
27: {
28:
Base *B=new Base;
29:
Derived *D=new Derived;
30:

B->Display(); //Base::Display()
31:
D->Display(); //Derived::Display()
32:
Show(B); //Base::Display()
33:
Show(D); //Derived::Display()
34:
return 0;
35: }



Các đặc trưng của phương thức ảo:


Phương thức ảo không thể là các hàm thành viên tĩnh.



Một phương thức ảo có thể được khai báo là friend trong một lớp khác nhưng các hàm friend



của lớp thì không thể là phương thức ảo.
Không cần thiết phải ghi rõ từ khóa virtual khi định nghĩa một phương thức ảo trong lớp dẫn



xuất (để cũng chẳng ảnh hưởng gì).

Để sự kết nối động được thực hiện thích hợp cho từng lớp dọc theo cây phả hệ, một khi phương



thức nào đó đã được xác định là ảo, từ lớp cơ sở đến các lớp dẫn xuất đều phải định nghĩa thống
nhất về tên, kiểu trả về và danh sách các tham số. Nếu đối với phương thức ảo ở lớp dẫn xuất,
chúng ta lại sơ suất định nghĩa các tham số khác đi một chút thì trình biên dịch sẽ xem đó là
phương thức khác. Đây chính là điều kiện để kết nối động.
Lớp trừu tượng



Trong quá trình thiết kế chương trình theo hướng đối tượng, để tạo nên một hệ thống phả hệ



mang tính kế thừa cao, người lập trình phải đoán trước sự phát triển của cấu trúc, từ đó chọn lựa
những thành viên phù hợp cho các lớp ở trên cùng. Rõ ràng đây là một công việc vô cùng khó
khăn. Để tránh tình trạng người lập trình xây dựng các đối tượng lãng phí bộ nhớ, ngôn ngữ C++
cho phép chúng ta thiết kế các lớp trừu tượng.
Trong cấu trúc hình dưới đây, không phải lớp nào cũng thực sự cần đến phương thức Print(),
nhưng nó có mặt khắp nơi để tạo ra bộ mặt chung cho mọi lớp trong cấu trúc cây. Phương thức
của lớp trên cùng như A::Print() thường là phương thức ảo để có được tính đa hình.



Khi ta gọi phương thức A::Print() là phương thức ảo rỗng (null virtual function), nó chẳng làm
gì hết. Tuy nhiên lớp A vẫn là một lớp bình thường, chúng ta có thể tạo ra một đối tượng thuộc
nó, có thể truy cập tới phương thức A::Print(). Để tránh trình trạng vô tình tạo ra đối tượng
thuộc lớp này, người ta thường xây dựng lớp trừu tượng, trình biên dịch cho phép tạo ra lớp có

các phương thức thuần ảo (pure virtual function) như sau:

Bộ môn Công nghệ phần mềm




class A
{
public:
virtual void Print() = 0;
}
Phương thức ảo Print() bây giờ là phương thức thuần ảo – phương thức có tên được gán bởi giá

trị zero. Lớp A chứa phương thức thuần ảo được gọi là lớp trừu tượng
Lưu ý:
+ Chúng ta không thể tạo ra một đối tượng của lớp trừu tượng, nhưng hoàn toàn có thể tạo ra
một con trỏ trỏ đến lớp này (vì con trỏ không phải là đối tượng thuộc lớp) hoặc là một tham chiếu.
+ Nếu trong lớp kế thừa từ lớp trừu tượng chúng ta không định nghĩa phương thức thuần ảo,
do tính kế thừa nó sẽ bao hàm phương thức thuần ảo của lớp cơ sở, nên lớp dẫn xuất này sẽ trở thành
lớp trừu tượng.
+ Theo định nghĩa lớp trừu tượng, nếu trong lớp dẫn xuất (từ lớp cơ sở trừu tượng) chúng ta
định nghĩa thêm một phương thức thuần ảo khác, lớp này cũng sẽ trở thành lớp trừu tượng.
• Các toán tử ảo
Toán tử thực chất cũng là một hàm nên chúng ta có thể tạo ra các toán tử ảo trong một lớp.
Tuy nhiên do đa năng hóa khi tạo một toán tử cần chú ý đến các kiểu của các toán hạng phải sử dụng
kiểu của lớp cơ sở gốc có toán tử ảo.
• Có constructor và destructor ảo hay không?



Constructor không thể là phương thức ảo, tuy nhiên trong constructor có thể gọi phương thức ảo

khác.
− Destructor có thể là phương thức ảo.
b) Nội dung thảo luận: Lớp trừu tượng có ý nghĩa gì, để tạo được đa hình cần xây dựng những gì?
c) Nội dung tự học: Xây dựng lớp trừu tượng, thực hiện đa hình
d) Bài tập (bắt buộc, mở rộng):
Xây dựng các lớp đối tượng hình học như: điểm, đoạn thẳng, đường tròn, hình chữ nhật, hình
vuông, tam giác, hình bình hành, hình thoi. Mỗi lớp có các thuộc tính riêng để xác định được hình vẽ
biểu diễn của nó như đoạn thẳng có điểm đầu, điểm cuối.... Mỗi lớp thực thi một phương thức
Draw() phủ quyết Draw() của lớp cơ sở gốc của các hình mà nó dẫn xuất. Hăy xây dựng lớp cơ sở
của các lớp trên và thực thi đa hình với phương thức Draw(). Tạo lớp Tester với hàm main() để thử
nghiệm tính đa hình.
4. Tài liệu tham khảo (sách, báo – chi tiết đến chương, mục, trang)
• Lập trình hướng đối tượng với C++ / Lê Đăng Hưng, Tạ Tuấn Anh, Nguyễn Hữu Đức, Nguyễn
Thanh Thủy (Chủ biên), - Hà Nội : Khoa học và Kỹ thuật, 2009. -346 trang. Chương V
• Giáo trình C++ & lập trình hướng đối tượng / Phạm Văn Ất (Chủ biên), Lê Trường Thông. – Hà
Nội : Hồng Đức, 2009. -495 trang. Chương 6.
• Object-Oriented Programming in C++ (4th Edition) / Robert Lafore. Sams Publishing, 2002.
Chapter 11.
5. Câu hỏi ôn tập
- Thế nào là đa hình?
- Thế nào là phương thức ảo ? Cú pháp xây dựng phương thức ảo ?
- Thế nào là lớp trừu tượng ? Cách xây dựng lớp trừu tượng ?
- Thế nào là các toán tử ảo ?
- Có hàm tạo và hàm hủy ảo hay không ?

Bộ môn Công nghệ phần mềm




Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×