Hướng đối tượng toàn tập 12
Chia sẻ bởi Lê Văn Thanh Thúc |
Ngày 10/05/2019 |
64
Chia sẻ tài liệu: Hướng đối tượng toàn tập 12 thuộc Tin học 12
Nội dung tài liệu:
1
Phương pháp lập trình hướng đối tượng – GV. Nguyễn Minh Huy
Đa hình
2
Phương pháp lập trình hướng đối tượng – GV. Nguyễn Minh Huy
Nội dung
Hàm ảo.
Hàm thuần ảo.
Hàm hủy ảo.
Bài tập.
3
Phương pháp lập trình hướng đối tượng – GV. Nguyễn Minh Huy
Nội dung
Hàm ảo.
Hàm thuần ảo.
Hàm hủy ảo.
Bài tập.
4
Phương pháp lập trình hướng đối tượng – GV. Nguyễn Minh Huy
Hàm ảo
Con trỏ đối tượng trong kế thừa:
Truy xuất đối tượng bằng con trỏ => linh động.
Truy xuất đối tượng kế thừa bằng con trỏ lớp cơ sở.
Kiểu con trỏ quyết định phương thức được gọi
liên kết tĩnh.
Đố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ở.
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.
void func(A obj) { }
B obj;
func(obj);
5
Phương pháp lập trình hướng đối tượng – GV. Nguyễn Minh Huy
Hàm ảo
Ví dụ:
class Animal
{
public:
void talk() { cout << “Don’t talk!”; }
};
class Cat: public Animal
{
public:
void talk() { cout << “Meo meo!”; }
};
class Dog: public Animal
{
public:
void talk() { cout << “Gau gau!”; }
};
6
Phương pháp lập trình hướng đối tượng – GV. Nguyễn Minh Huy
Hàm ảo
void main()
{
Animal a;
Cat c;
Dog d;
Animal *p;
p = &a;
p->talk();
p = &c;
p->talk();
p = &d;
p->talk();
}
Animal talks!!
Animal talks!!
Animal talks!!
Animal talks!!
Animal talks!!
Ví dụ:
void giveATalk(Animal *p)
{
p->talk();
}
void main()
{
Cat c;
Dog d;
giveATalk(&c);
giveATalk(&d);
}
7
Phương pháp lập trình hướng đối tượng – GV. Nguyễn Minh Huy
Hàm ảo
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++:
virtual;
8
Phương pháp lập trình hướng đối tượng – GV. Nguyễn Minh Huy
Hàm ảo
Ví dụ:
class Animal
{
public:
virtual void talk() { cout << “Don’t talk!”; }
};
class Cat: public Animal
{
public:
void talk() { cout << “Meo meo!”; }
};
class Dog: public Animal
{
public:
void talk() { cout << “Gau gau!”; }
};
9
Phương pháp lập trình hướng đối tượng – GV. Nguyễn Minh Huy
Hàm ảo
void main()
{
Animal a;
Cat c;
Dog d;
Animal *p;
p = &a;
p->Talk();
p = &c;
p->Talk();
p = &d;
p->Talk();
}
Cat talks!!
Dog talks!!
Animal talks!!
Cat talks!!
Dog talks!!
Ví dụ:
void giveATalk(Animal *p)
{
p->talk();
}
void main()
{
Cat c;
Dog d;
giveATalk(&c);
giveATalk(&d);
}
10
Phương pháp lập trình hướng đối tượng – GV. Nguyễn Minh Huy
Hàm ảo
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)
{
p->talk();
}
void giveATalk(Animal obj, int iType)
{
if (iType == 0)
{
Cat c = (Cat)obj;
c.talk();
}
else if (iType == 1)
{
Dog d = (Dog)obj;
d.talk();
}
}
11
Phương pháp lập trình hướng đối tượng – GV. Nguyễn Minh Huy
Nội dung
Hàm ảo.
Hàm thuần ảo.
Hàm hủy ảo.
Bài tập.
12
Phương pháp lập trình hướng đối tượng – GV. Nguyễn Minh Huy
Hàm thuần ảo
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!!
13
Phương pháp lập trình hướng đối tượng – GV. Nguyễn Minh Huy
Hàm thuần ảo
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++:
virtual = 0;
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.
14
Phương pháp lập trình hướng đối tượng – GV. Nguyễn Minh Huy
Hàm thuần ảo
void main()
{
Animal a; // Sai.
Animal *p = new Animal; // Sai.
Animal *q = new Cat; // Đúng.
q->talk();
}
Ví dụ:
class Animal
{
public:
virtual void talk() = 0;
};
class Cat: public Animal
{
public:
void talk() { cout << “Meo meo!”; }
};
class Dog: public Animal
{
public:
void talk() { cout << “Gau gau!”; }
};
Cat talks!!
15
Phương pháp lập trình hướng đối tượng – GV. Nguyễn Minh Huy
Nội dung
Hàm ảo.
Hàm thuần ảo.
Hàm hủy ảo.
Bài tập.
16
Phương pháp lập trình hướng đối tượng – GV. Nguyễn Minh Huy
Hàm hủy ảo
void main()
{
GiaoVien *p1 = new GiaoVien;
delete p1;
GVCN *p2 = new GVCN;
delete p2;
GiaoVien *p3 = new GVCN;
delete p3;
}
Ví dụ:
class GiaoVien
{
private:
char *m_strHoTen;
public:
~GiaoVien() { delete m_strHoTen; }
};
class GVCN : public GiaoVien
{
private:
char *m_strLopCN;
public:
~GVCN() { delete m_strLopCN; }
};
~GiaoVien()
~GVCN()
~GiaoVien()
~GiaoVien()
17
Phương pháp lập trình hướng đối tượng – GV. Nguyễn Minh Huy
Hàm hủy ảo
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:
virtual ~GiaoVien() { delete m_strHoTen; }
};
GiaoVien *p3 = new GVCN;
delete p3;
~GVCN()
~GiaoVien()
18
Phương pháp lập trình hướng đối tượng – GV. Nguyễn Minh Huy
Tóm tắt
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ỏ.
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.
Hàm hủy ảo:
Hàm hủy phải luôn luôn là hàm ảo.
19
Phương pháp lập trình hướng đối tượng – GV. Nguyễn Minh Huy
Nội dung
Hàm ảo.
Hàm thuần ảo.
Hàm hủy ảo.
Bài tập.
20
Phương pháp lập trình hướng đối tượng – GV. Nguyễn Minh Huy
Bài tập
Bài tập 12.1:
class A
{ public:
[yyy] void f1() { cout << “Good morning. ”; f2(); }
[zzz] void f2() { cout << “Good afternoon. ”; }
};
class B: public A
{ public:
void f1() { cout << “Good evening. ”; f2(); }
void f2() { cout << “Good night. ”; }
};
void main()
{
A *pObj = new B;
pObj->f1();
}
Cho biết những gì xuất hiện
trên màn hình trong các
trường hợp:
a) [yyy] trống, [zzz] trống.
b) [yyy] trống, [zzz] virtual.
c) [yyy] virtual, [zzz] trống.
d) [yyy] virtual, [zzz] virtual.
21
Phương pháp lập trình hướng đối tượng – GV. Nguyễn Minh Huy
Bài tập
Bài tập 12.2:
Có 2 loại hình: đường thẳng và hình chữ nhật.
- Đường thẳng: biểu diễn bởi hai điểm đầu cuối.
- Hình chữ nhật: biểu diễn bởi hai điểm trên trái và dưới phải.
Giả sử có danh sách các hình thuộc 2 loại trên. Viết chương trình xuất thông tin của từng hình trong danh sách đó.
Sau đó, giả sử có thêm loại hình mới là hình tròn.
- Hình tròn: biểu diễn bởi tâm và bán kính.
Khi đó, chương trình sẽ phải được chỉnh sửa như thế nào?
22
Phương pháp lập trình hướng đối tượng – GV. Nguyễn Minh Huy
Bài tập
Bài tập 12.3:
Tốc độ chạy của các động vật cho bởi bảng sau:
Viết chương trình cho phép so sánh tốc độ chạy giữa một cặp động vật bất kỳ thuộc nhóm trên.
Thêm vào con ngựa chạy 60km/h, chương trình sẽ thay đổi thế nào?
Phương pháp lập trình hướng đối tượng – GV. Nguyễn Minh Huy
Đa hình
2
Phương pháp lập trình hướng đối tượng – GV. Nguyễn Minh Huy
Nội dung
Hàm ảo.
Hàm thuần ảo.
Hàm hủy ảo.
Bài tập.
3
Phương pháp lập trình hướng đối tượng – GV. Nguyễn Minh Huy
Nội dung
Hàm ảo.
Hàm thuần ảo.
Hàm hủy ảo.
Bài tập.
4
Phương pháp lập trình hướng đối tượng – GV. Nguyễn Minh Huy
Hàm ảo
Con trỏ đối tượng trong kế thừa:
Truy xuất đối tượng bằng con trỏ => linh động.
Truy xuất đối tượng kế thừa bằng con trỏ lớp cơ sở.
Kiểu con trỏ quyết định phương thức được gọi
liên kết tĩnh.
Đố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ở.
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.
void func(A obj) { }
B obj;
func(obj);
5
Phương pháp lập trình hướng đối tượng – GV. Nguyễn Minh Huy
Hàm ảo
Ví dụ:
class Animal
{
public:
void talk() { cout << “Don’t talk!”; }
};
class Cat: public Animal
{
public:
void talk() { cout << “Meo meo!”; }
};
class Dog: public Animal
{
public:
void talk() { cout << “Gau gau!”; }
};
6
Phương pháp lập trình hướng đối tượng – GV. Nguyễn Minh Huy
Hàm ảo
void main()
{
Animal a;
Cat c;
Dog d;
Animal *p;
p = &a;
p->talk();
p = &c;
p->talk();
p = &d;
p->talk();
}
Animal talks!!
Animal talks!!
Animal talks!!
Animal talks!!
Animal talks!!
Ví dụ:
void giveATalk(Animal *p)
{
p->talk();
}
void main()
{
Cat c;
Dog d;
giveATalk(&c);
giveATalk(&d);
}
7
Phương pháp lập trình hướng đối tượng – GV. Nguyễn Minh Huy
Hàm ảo
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++:
virtual
8
Phương pháp lập trình hướng đối tượng – GV. Nguyễn Minh Huy
Hàm ảo
Ví dụ:
class Animal
{
public:
virtual void talk() { cout << “Don’t talk!”; }
};
class Cat: public Animal
{
public:
void talk() { cout << “Meo meo!”; }
};
class Dog: public Animal
{
public:
void talk() { cout << “Gau gau!”; }
};
9
Phương pháp lập trình hướng đối tượng – GV. Nguyễn Minh Huy
Hàm ảo
void main()
{
Animal a;
Cat c;
Dog d;
Animal *p;
p = &a;
p->Talk();
p = &c;
p->Talk();
p = &d;
p->Talk();
}
Cat talks!!
Dog talks!!
Animal talks!!
Cat talks!!
Dog talks!!
Ví dụ:
void giveATalk(Animal *p)
{
p->talk();
}
void main()
{
Cat c;
Dog d;
giveATalk(&c);
giveATalk(&d);
}
10
Phương pháp lập trình hướng đối tượng – GV. Nguyễn Minh Huy
Hàm ảo
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)
{
p->talk();
}
void giveATalk(Animal obj, int iType)
{
if (iType == 0)
{
Cat c = (Cat)obj;
c.talk();
}
else if (iType == 1)
{
Dog d = (Dog)obj;
d.talk();
}
}
11
Phương pháp lập trình hướng đối tượng – GV. Nguyễn Minh Huy
Nội dung
Hàm ảo.
Hàm thuần ảo.
Hàm hủy ảo.
Bài tập.
12
Phương pháp lập trình hướng đối tượng – GV. Nguyễn Minh Huy
Hàm thuần ảo
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!!
13
Phương pháp lập trình hướng đối tượng – GV. Nguyễn Minh Huy
Hàm thuần ảo
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++:
virtual
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.
14
Phương pháp lập trình hướng đối tượng – GV. Nguyễn Minh Huy
Hàm thuần ảo
void main()
{
Animal a; // Sai.
Animal *p = new Animal; // Sai.
Animal *q = new Cat; // Đúng.
q->talk();
}
Ví dụ:
class Animal
{
public:
virtual void talk() = 0;
};
class Cat: public Animal
{
public:
void talk() { cout << “Meo meo!”; }
};
class Dog: public Animal
{
public:
void talk() { cout << “Gau gau!”; }
};
Cat talks!!
15
Phương pháp lập trình hướng đối tượng – GV. Nguyễn Minh Huy
Nội dung
Hàm ảo.
Hàm thuần ảo.
Hàm hủy ảo.
Bài tập.
16
Phương pháp lập trình hướng đối tượng – GV. Nguyễn Minh Huy
Hàm hủy ảo
void main()
{
GiaoVien *p1 = new GiaoVien;
delete p1;
GVCN *p2 = new GVCN;
delete p2;
GiaoVien *p3 = new GVCN;
delete p3;
}
Ví dụ:
class GiaoVien
{
private:
char *m_strHoTen;
public:
~GiaoVien() { delete m_strHoTen; }
};
class GVCN : public GiaoVien
{
private:
char *m_strLopCN;
public:
~GVCN() { delete m_strLopCN; }
};
~GiaoVien()
~GVCN()
~GiaoVien()
~GiaoVien()
17
Phương pháp lập trình hướng đối tượng – GV. Nguyễn Minh Huy
Hàm hủy ảo
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:
virtual ~GiaoVien() { delete m_strHoTen; }
};
GiaoVien *p3 = new GVCN;
delete p3;
~GVCN()
~GiaoVien()
18
Phương pháp lập trình hướng đối tượng – GV. Nguyễn Minh Huy
Tóm tắt
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ỏ.
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.
Hàm hủy ảo:
Hàm hủy phải luôn luôn là hàm ảo.
19
Phương pháp lập trình hướng đối tượng – GV. Nguyễn Minh Huy
Nội dung
Hàm ảo.
Hàm thuần ảo.
Hàm hủy ảo.
Bài tập.
20
Phương pháp lập trình hướng đối tượng – GV. Nguyễn Minh Huy
Bài tập
Bài tập 12.1:
class A
{ public:
[yyy] void f1() { cout << “Good morning. ”; f2(); }
[zzz] void f2() { cout << “Good afternoon. ”; }
};
class B: public A
{ public:
void f1() { cout << “Good evening. ”; f2(); }
void f2() { cout << “Good night. ”; }
};
void main()
{
A *pObj = new B;
pObj->f1();
}
Cho biết những gì xuất hiện
trên màn hình trong các
trường hợp:
a) [yyy] trống, [zzz] trống.
b) [yyy] trống, [zzz] virtual.
c) [yyy] virtual, [zzz] trống.
d) [yyy] virtual, [zzz] virtual.
21
Phương pháp lập trình hướng đối tượng – GV. Nguyễn Minh Huy
Bài tập
Bài tập 12.2:
Có 2 loại hình: đường thẳng và hình chữ nhật.
- Đường thẳng: biểu diễn bởi hai điểm đầu cuối.
- Hình chữ nhật: biểu diễn bởi hai điểm trên trái và dưới phải.
Giả sử có danh sách các hình thuộc 2 loại trên. Viết chương trình xuất thông tin của từng hình trong danh sách đó.
Sau đó, giả sử có thêm loại hình mới là hình tròn.
- Hình tròn: biểu diễn bởi tâm và bán kính.
Khi đó, chương trình sẽ phải được chỉnh sửa như thế nào?
22
Phương pháp lập trình hướng đối tượng – GV. Nguyễn Minh Huy
Bài tập
Bài tập 12.3:
Tốc độ chạy của các động vật cho bởi bảng sau:
Viết chương trình cho phép so sánh tốc độ chạy giữa một cặp động vật bất kỳ thuộc nhóm trên.
Thêm vào con ngựa chạy 60km/h, chương trình sẽ thay đổi thế nào?
* Một số tài liệu cũ có thể bị lỗi font khi hiển thị do dùng bộ mã không phải Unikey ...
Người chia sẻ: Lê Văn Thanh Thúc
Dung lượng: |
Lượt tài: 2
Loại file:
Nguồn : Chưa rõ
(Tài liệu chưa được thẩm định)