Bài giảng Phương pháp lập trình hướng đối tượng - Tuần 12: Đa hình - Nguyễn Lê Hoàng Dũng

Đa hình  
Phương pháp lập trình hướng đối tượng – GV. Nguyễn Minh Huy  
1
Nội dung  
n Hàm ảo.  
n Hàm thuần ảo.  
n Hàm hủy ảo.  
n Bài tập.  
Phương pháp lập trình hướng đối tượng – GV. Nguyễn Minh Huy  
2
Nội dung  
n Hàm ảo.  
n Hàm thuần ảo.  
n Hàm hủy ảo.  
n Bài tập.  
Phương pháp lập trình hướng đối tượng – GV. Nguyễn Minh Huy  
3
Hàm ảo  
n Con trỏ đối tượng trong kế thừa:  
n Truy xuất đối tượng bằng con trỏ => linh động.  
n Truy xuất đối tượng kế thừa bằng con trỏ lớp cơ sở.  
n Kiểu con trỏ quyết định phương thức được gọi  
è liên kết tĩnh.  
n Đối tượng kế thừa truyền vào hàm nhận tham số kiểu cơ sở.  
è Đối tượng kế thừa có thể đóng vai trò đối tượng cơ sở.  
// B kế thừa A.  
void func(A obj) { }  
A obj;  
A *p;  
// B kế thừa A.  
B obj;  
A *p = &obj;  
B obj;  
p = &obj;  
p = new A;  
p->func();  
func(obj);  
Phương pháp lập trình hướng đối tượng – GV. Nguyễn Minh Huy  
4
Hàm ảo  
n Ví dụ:  
class Animal  
{
public:  
Animal  
+Talk()  
void talk() { cout << “Don’t talk!”; }  
};  
class Cat: public Animal  
{
public:  
void talk() { cout << “Meo meo!”; }  
Cat  
+Talk()  
Dog  
+Talk()  
};  
class Dog: public Animal  
{
public:  
void talk() { cout << “Gau gau!”; }  
};  
Phương pháp lập trình hướng đối tượng – GV. Nguyễn Minh Huy  
5
Hàm ảo  
n Ví dụ:  
void main()  
{
void giveATalk(Animal *p)  
{
>talk();  
Animal a;  
Cat  
c;  
}
Dog  
d;  
void main()  
{
Animal *
p = &a;  
>talk();  
Animal talks!!  
Animal talks!!  
Animal talks!!  
Cat  
Dog  
c;  
d;  
Animal talks!!  
Animal talks!!  
p = &c;  
>talk();  
giveATalk(&c);  
giveATalk(&d);  
}
p = &d;  
>talk();  
}
Phương pháp lập trình hướng đối tượng – GV. Nguyễn Minh Huy  
6
Hàm ảo  
n Khái niệm hàm ảo:  
Một phương thức của lớp.  
Mang tính ảo.  
è Chuyển lời gọi hàm cho đúng đối tượng con trỏ  
đang trỏ đến.  
è Liên kết động.  
Chỉ có ý nghĩa khi gọi thông qua con trỏ.  
Khai báo hàm ảo trong C++:  
virtua<Chữ ký hàm>;  
Phương pháp lập trình hướng đối tượng – GV. Nguyễn Minh Huy  
7
Hàm ảo  
n Ví dụ:  
class Animal  
{
public:  
virtuavoid talk() { cout << “Don’t talk!”; }  
Animal  
};  
class Cat: public Animal  
{
+virtual Talk()  
public:  
void talk() { cout << “Meo meo!”; }  
};  
Cat  
+Talk()  
Dog  
+Talk()  
class Dog: public Animal  
{
public:  
void talk() { cout << “Gau gau!”; }  
};  
Phương pháp lập trình hướng đối tượng – GV. Nguyễn Minh Huy  
8
Hàm ảo  
n Ví dụ:  
void main()  
{
void giveATalk(Animal *p)  
{
>talk();  
Animal a;  
Cat  
c;  
}
Dog  
d;  
void main()  
{
Animal *
p = &a;  
>Talk();  
Animal talks!!  
Cat talks!!  
Cat  
Dog  
c;  
d;  
Cat talks!!  
Dog talks!!  
p = &c;  
>Talk();  
giveATalk(&c);  
giveATalk(&d);  
}
Dog talks!!  
p = &d;  
>Talk();  
}
Phương pháp lập trình hướng đối tượng – GV. Nguyễn Minh Huy  
9
Hàm ảo  
n Sử dụng hàm ảo để làm gì?  
Gọn gàng, đơn giản, uyển chuyển, linh động.  
è Chương trình có tính dễ mở rộng, nâng cấp.  
void giveATalk(Animal *p)  
void giveATalk(Animal obj, int iType)  
{
{
>talk();  
}
if (iType == 0)  
{
Cat c = (Cat)obj;  
c.talk();  
}
else if (iType == 1)  
{
Dog d = (Dog)obj;  
d.talk();  
}
}
Phương pháp lập trình hướng đối tượng – GV. Nguyễn Minh Huy  
10  
Nội dung  
n Hàm ảo.  
n Hàm thuần ảo.  
n Hàm hủy ảo.  
n Bài tập.  
Phương pháp lập trình hướng đối tượng – GV. Nguyễn Minh Huy  
11  
Hàm thuần ảo  
n Có một số hàm ảo không thể cài đặt hoặc  
không có ý nghĩa khi cài đặt trong lớp cơ sở.  
class Animal  
{
public:  
virtual void talk() { cout << “Don’t talk!”; }  
};  
Biến thành hàm thuần ảo!!  
Phương pháp lập trình hướng đối tượng – GV. Nguyễn Minh Huy  
12  
Hàm thuần ảo  
n Khái niệm hàm thuần ảo:  
Hàm ảo chỉ có khai báo mà không có cài đặt.  
Phần cài đặt do lớp kế thừa đảm nhận.  
Khai báo trong C++:  
virtua<Chữ ký hàm> = ;  
n Lớp trừu tượng (abstract class):  
Lớp chứa hàm thuần ảo.  
Không thể tạo đối tượng từ lớp trừu tượng.  
Chỉ dùng để kế thừa.  
Phương pháp lập trình hướng đối tượng – GV. Nguyễn Minh Huy  
13  
Hàm thuần ảo  
n Ví dụ:  
void main()  
{
class Animal  
{
public:  
Animal a;  
// Sai.  
Animal *p = new Animal; // Sai.  
virtual void talk() = 0;  
Animal *q = new Cat; // Đúng.  
};  
class Cat: public Animal  
{
>talk();  
}
public:  
Cat talks!!  
void talk() { cout << “Meo meo!”; }  
};  
class Dog: public Animal  
{
public:  
void talk() { cout << “Gau gau!”; }  
};  
Phương pháp lập trình hướng đối tượng – GV. Nguyễn Minh Huy  
14  
Nội dung  
n Hàm ảo.  
n Hàm thuần ảo.  
n Hàm hủy ảo.  
n Bài tập.  
Phương pháp lập trình hướng đối tượng – GV. Nguyễn Minh Huy  
15  
Hàm hủy ảo  
n Ví dụ:  
void main()  
{
class GiaoVien  
{
private:  
char  
public:  
iaoVien *p1 = new GiaoVien;  
elete p1;  
~GiaoVien()  
*m_strHoTen;  
VCN *p2 = new GVCN;  
elete p2;  
~GiaoVien() { delete m_
~GVCN()  
};  
~GiaoVien()  
class GVCN : public GiaoVien  
{
private:  
GiaoVien *p3 = new GVCN;  
elete p3;  
~GiaoVien()  
char  
public:  
~GVCN() { delete m_strLopCN; }  
*m_strLopCN;  
};  
Phương pháp lập trình hướng đối tượng – GV. Nguyễn Minh Huy  
16  
Hàm hủy ảo  
n Dr. Guru khuyên:  
Hàm hủy của lớp phải luôn là hàm ảo.  
è Chuyển lời gọi đến hàm hủy của lớp kế thừa.  
class GiaoVien  
{
private:  
char *m_strHoTen;  
public:  
virtua~GiaoVien() { delete m_strHoTen; }  
};  
GiaoVien *p3 = new GVCN;  
delete p3;  
~GVCN()  
~GiaoVien()  
Phương pháp lập trình hướng đối tượng – GV. Nguyễn Minh Huy  
17  
Tóm tắt  
n Hàm ảo:  
Chuyển lời gọi hàm đến đúng đối tượng.  
Chỉ có ý nghĩa khi gọi từ con trỏ.  
n Hàm thuần ảo:  
Hàm ảo chỉ có khai báo mà không có cài đặt.  
Lớp kế thừa đảm nhận việc cài đặt.  
Lớp có chứa hàm thuần ảo è lớp trừu tượng  
Lớp trừu tượng chỉ dùng để kế thừa.  
n Hàm hủy ảo:  
Hàm hủy phải luôn luôn là hàm ảo.  
Phương pháp lập trình hướng đối tượng – GV. Nguyễn Minh Huy  
18  
Nội dung  
n Hàm ảo.  
n Hàm thuần ảo.  
n Hàm hủy ảo.  
n Bài tập.  
Phương pháp lập trình hướng đối tượng – GV. Nguyễn Minh Huy  
19  
Bài tập  
n Bài tập 12.1:  
class A  
Cho biết những gì xuất hiện  
trên màn hình trong các  
trường hợp:  
{ public:  
[yyyvoid f1() { cout << “Good morninn”f2()}  
[zzzvoid f2() { cout << “Good afternoon”; }  
a) [yyy] trống, [zzz] trống.  
b) [yyy] trống, [zzz] virtual.  
c) [yyy] virtual, [zzz] trống.  
d) [yyy] virtual, [zzz] virtual.  
};  
class B: public A  
{ public:  
void f1() { cout << “Good eveninn”f2()}  
void f2() { cout << “Good nighn”; }  
};  
void main()  
{
A *pObj = new B;  
pO>f1();  
}
Phương pháp lập trình hướng đối tượng – GV. Nguyễn Minh Huy  
20  
Tải về để xem bản đầy đủ
pdf 23 trang myanh 22880 Free
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Phương pháp lập trình hướng đối tượng - Tuần 12: Đa hình - Nguyễn Lê Hoàng Dũng", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

File đính kèm:

  • pdfbai_giang_phuong_phap_lap_trinh_huong_doi_tuong_tuan_12_da_h.pdf
  • zipOOP-W12-Polymorphism-Demo.zip
  • zipOOP-W12-Polymorphism-Demo2.zip