Lớp có chứa hàm thuần ảo Lớp có chứa hàm thuần ảo lớp trừu tượng lớp trừu tượng Lớp trừu tượng chỉ dùng để kế thừa. Lớp trừu tượng chỉ dùng để kế thừa[r]
(1)Đa hình
(2)Nội dung
Nội dung Hàm ảo.Hàm ảo.
(3)Nội dung
Nội dung Hàm ảo.Hàm ảo.
(4)Hàm ảo
Hàm ảo
Con trỏ đối tượng kế thừa:Con trỏ đối tượng kế thừa:
Truy xuất đối tượng trỏ => linh động.Truy xuất đối tượng trỏ => linh động.
Truy xuất đối tượng kế thừa trỏ lớp sở.Truy xuất đối tượng kế thừa trỏ lớp sở. Kiểu trỏ định phương thức gọiKiểu trỏ định phương thức gọi
liên kết tĩnh.liên kết tĩnh.
Đối tượng kế thừa truyền vào hàm nhận tham số kiểu sở.Đối tượng kế thừa truyền vào hàm nhận tham số kiểu sở.
Đối tượng kế thừa đóng vai trị đối tượng sở.Đối tượng kế thừa đóng vai trị đối tượng sở.
A obj;
A *p;
p = &obj; p = new A; A obj;
A *p;
p = &obj; p = new A;
// B kế thừa A B obj;
A *p = &obj; p->func();
// B kế thừa A B obj;
A *p = &obj; p->func();
// B kế thừa A void func(A obj) { } B obj;
func(obj);
// B kế thừa A void func(A obj) { } B obj;
(5)Hàm ảo
Hàm ảo
Animal +Talk()
Cat +Talk()
Dog +Talk() Ví dụ:Ví dụ:
class Animal class Animal {
{
public: public:
void talk() { cout << “Don’t talk!”; } void talk() { cout << “Don’t talk!”; } };
};
class Cat: public Animal class Cat: public Animal {
{
public: public:
void talk() { cout << “Meo meo!”; } void talk() { cout << “Meo meo!”; } };
};
class Dog: public Animal class Dog: public Animal {
{
public: public:
void talk() { cout << “Gau gau!”; } void talk() { cout << “Gau gau!”; } };
(6)Hàm ảo Hàm ảo void main() void main() { { Animal Animal a;a; Cat
Cat c;c; Dog
Dog d;d; Animal
Animal *p;*p; p = &a;
p = &a;
p->talk();
p->talk();
p = &c; p = &c;
p->talk();
p->talk();
p = &d; p = &d;
p->talk(); p->talk(); } } Animal talks!! Animal talks!! Animal talks!! Animal talks!! Animal talks!! Animal talks!! Animal talks!! Animal talks!! Animal talks!! Animal talks!!
Ví dụ:Ví dụ:
void giveATalk(Animal *p) void giveATalk(Animal *p) { { p->talk(); p->talk(); } } void main() void main() { { Cat
Cat c;c; Dog
Dog d;d;
(7)Hàm ảo
Hàm ảo
Khái niệm hàm ảo:Khái niệm hàm ảo:
Một phương thức lớp.Một phương thức lớp. Mang tính ảo.Mang tính ảo.
Chuyển lời gọi hàm cho đối tượng trỏ Chuyển lời gọi hàm cho đối tượng trỏ
đang trỏ đến.
đang trỏ đến.
Liên kết động.Liên kết động.
Chỉ có ý nghĩa gọi thơng qua trỏ.Chỉ có ý nghĩa gọi thơng qua trỏ. Khai báo hàm ảo C++:Khai báo hàm ảo C++:
virtual
(8)Hàm ảo
Hàm ảo
Animal +virtual Talk()
Cat +Talk()
Dog +Talk() Ví dụ:Ví dụ:
class Animal class Animal {
{
public: public:
virtual
virtual void talk() { cout << “Don’t talk!”; } void talk() { cout << “Don’t talk!”; } };
};
class Cat: public Animal class Cat: public Animal {
{
public: public:
void talk() { cout << “Meo meo!”; } void talk() { cout << “Meo meo!”; } };
};
class Dog: public Animal class Dog: public Animal {
{
public: public:
void talk() { cout << “Gau gau!”; } void talk() { cout << “Gau gau!”; } };
(9)Hàm ảo Hàm ảo void main() void main() { { Animal Animal a;a; Cat
Cat c;c; Dog
Dog d;d; Animal
Animal *p;*p; p = &a;
p = &a;
p->Talk();
p->Talk();
p = &c; p = &c;
p->Talk();
p->Talk();
p = &d; p = &d;
p->Talk(); p->Talk(); } } Cat talks!! Cat talks!! Dog talks!! Dog talks!! Animal talks!! Animal talks!! Cat talks!! Cat talks!! Dog talks!! Dog talks!!
Ví dụ:Ví dụ:
void giveATalk(Animal *p) void giveATalk(Animal *p) { { p->talk(); p->talk(); } } void main() void main() { { Cat
Cat c;c; Dog
Dog d;d;
(10)Hàm ảo
Hàm ảo
Sử dụng hàm ảo để làm gì?Sử dụng hàm ảo để làm gì?
Gọn gàng, đơn giản, uyển chuyển, linh động.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.Chương trình có tính dễ mở rộng, nâng cấp.
void giveATalk(Animal *p) void giveATalk(Animal *p) { { p->talk(); p->talk(); } }
void giveATalk(Animal obj, int iType) void giveATalk(Animal obj, int iType) {
{
if (iType == 0) if (iType == 0) {
{
Cat c = (Cat)obj; Cat c = (Cat)obj; c.talk();
c.talk(); }
}
else if (iType == 1) else if (iType == 1) {
{
(11)Nội dung
Nội dung Hàm ảo.Hàm ảo.
Hàm ảo.Hàm ảo. Hàm hủy ảo.Hàm hủy ảo.
(12)Hàm ảo
Hàm ảo
Có số hàm ảo khơng thể cài đặt Có số hàm ảo khơng thể cài đặt
khơng có ý nghĩa cài đặt lớp sở. khơng có ý nghĩa cài đặt lớp sở.
class Animal class Animal {
{
public: public:
virtual void talk() { cout << “Don’t talk!”; } virtual void talk() { cout << “Don’t talk!”; } };
};
(13)Hàm ảo
Hàm ảo
Khái niệm hàm ảo:Khái niệm hàm ảo:
Hàm ảo có khai báo mà khơng có cài đặt.Hàm ảo có khai báo mà khơng có cài đặt. Phần cài đặt lớp kế thừa đảm nhận.Phần cài đặt lớp kế thừa đảm nhận.
Khai báo C++:Khai báo C++: virtual
virtual <Chữ ký hàm> <Chữ ký hàm> = 0= 0;;
Lớp trừu tượng (abstract class):Lớp trừu tượng (abstract class):
Lớp chứa hàm ảo.Lớp chứa hàm ảo.
(14)Hàm ảo
Hàm ảo
void main() void main() {
{
Animal a;
Animal a; // Sai // Sai Animal *p = new Animal; // Sai Animal *p = new Animal; // Sai Animal *q = new Cat; // Đúng Animal *q = new Cat; // Đúng q->talk();
q->talk(); }
}
Ví dụ:Ví dụ:
class Animal class Animal { { public: public:
virtual void talk() = 0; virtual void talk() = 0;
}; };
class Cat: public Animal class Cat: public Animal {
{
public: public:
void talk() { cout << “Meo meo!”; } void talk() { cout << “Meo meo!”; } };
};
class Dog: public Animal class Dog: public Animal {
{
public: public:
void talk() { cout << “Gau gau!”; } void talk() { cout << “Gau gau!”; } };
};
Cat talks!!
(15)Nội dung
Nội dung Hàm ảo.Hàm ảo.
(16)Hàm hủy ảo
Hàm hủy ảo
void main() void main() {
{
GiaoVien *p1 = new GiaoVien; GiaoVien *p1 = new GiaoVien; delete p1;
delete p1; GVCN
GVCN *p2 = new GVCN; *p2 = new GVCN; delete p2;
delete p2;
GiaoVien *p3 = new GVCN; GiaoVien *p3 = new GVCN; delete p3;
delete p3; }
}
Ví dụ:Ví dụ:
class GiaoVien class GiaoVien { { private: private: char
char *m_strHoTen;*m_strHoTen; public:
public:
~GiaoVien() { delete m_strHoTen; } ~GiaoVien() { delete m_strHoTen; } };
};
class GVCN : public GiaoVien class GVCN : public GiaoVien {
{
private: private:
char
char *m_strLopCN;*m_strLopCN; public:
public:
(17)Hàm hủy ảo
Hàm hủy ảo
Dr Guru khuyên:Dr Guru khuyên:
Hàm hủy lớp phải hàm ảo.Hàm hủy lớp phải hàm ảo.
Chuyển lời gọi đến hàm hủy lớp kế thừa.Chuyển lời gọi đến hàm hủy lớp kế thừa.
class GiaoVien class GiaoVien {
{
private: private: char
char *m_strHoTen;*m_strHoTen; public:
public:
virtual
virtual ~GiaoVien() { delete m_strHoTen; } ~GiaoVien() { delete m_strHoTen; } };
};
GiaoVien *p3 = new GVCN; GiaoVien *p3 = new GVCN;
delete p3;
delete p3;
~GVCN() ~GiaoVien()
(18)Tóm tắt
Tóm tắt Hàm ảo:Hàm ảo:
Chuyển lời gọi hàm đến đối tượng.Chuyển lời gọi hàm đến đối tượng. Chỉ có ý nghĩa gọi từ trỏ.Chỉ có ý nghĩa gọi từ trỏ.
Hàm ảo:Hàm ảo:
Hàm ảo có khai báo mà khơng có cài đặt.Hàm ảo 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 kế thừa đảm nhận việc cài đặt.
Lớp có chứa hàm ảo Lớp có chứa hàm ảo lớp trừu tượng lớp trừu tượng Lớp trừu tượng dùng để kế thừa.Lớp trừu tượng dùng để kế thừa.
Hàm hủy ảo:Hàm hủy ảo:
(19)Nội dung
Nội dung Hàm ảo.Hàm ảo.
(20)Bài tập
Bài tập
Bài tập 12.1:Bài tập 12.1:
class A class A { public: { public:
[yyy]
[yyy] void f1() { cout << “Good morning.\n”; void f1() { cout << “Good morning.\n”; f2();f2(); } }
[zzz]
[zzz] void f2() { cout << “Good afternoon.\n”; } void f2() { cout << “Good afternoon.\n”; } };
};
class B: public A class B: public A { public:
{ public:
void f1() { cout << “Good evening.\n”;
void f1() { cout << “Good evening.\n”; f2();f2(); } } void f2() { cout << “Good night.\n”; }
void f2() { cout << “Good night.\n”; } }; }; void main() void main() { {
A *pObj = new B; A *pObj = new B; pObj->f1();
pObj->f1(); }
}
Cho biết xuất Cho biết xuất hình hình trường hợp:
trường hợp:
(21)Bài tập
Bài tập
Bài tập 12.2:Bài tập 12.2:
Có loại hình: Có loại hình:
- Hình tam giác: biểu diễn đỉnh. - Hình tam giác: biểu diễn đỉnh.
- Hình chữ nhật: biểu diễn điểm trái phải. - Hình chữ nhật: biểu diễn điểm trái phải.
Giả sử có sẵn danh sách hình xuất thơng tin hình Giả sử có sẵn danh sách hình xuất thơng tin hình
trong danh sách đó. trong danh sách đó.
Sau đó, giả sử có thêm loại hình hình trịn. Sau đó, giả sử có thêm loại hình hình trịn.
- Hình trịn: biểu diễn tâm bán kính. - Hình trịn: biểu diễn tâm bán kính.
(22)Bài tập
Bài tập
Bài tập 12.3:Bài tập 12.3:
Tốc độ chạy động vật cho bảng sau: Tốc độ chạy động vật cho bảng sau:
Viết chương trình cho phép so sánh tốc độ chạy cặp động vật Viết chương trình cho phép so sánh tốc độ chạy cặp động vật
bất kỳ thuộc nhóm trên. bất kỳ thuộc nhóm trên.
Thêm vào ngựa chạy 60km/h, chương trình thay đổi nào? Thêm vào ngựa chạy 60km/h, chương trình thay đổi nào?
Động vật
Động vật Tốc độTốc độ
Báo
Báo 100km/h100km/h Linh dương
Linh dương 80km/h80km/h Sư tử
Sư tử 70km/h70km/h Chó
Chó 60km/h60km/h Người