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 đủ
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:
bai_giang_phuong_phap_lap_trinh_huong_doi_tuong_tuan_12_da_h.pdf
OOP-W12-Polymorphism-Demo.zip
OOP-W12-Polymorphism-Demo2.zip

