Bài giảng Lập trình hướng đối tượng - Tuần 10: Thảo luận một số vấn đề về kế thừa - Nguyễn Khắc Huy

Thảo luận một số vấn đề  
về kế thừa  
Nguyễn Khắc Huy  
BMCNPM – ĐHKHTN TPHCM  
09/2018  
1
Nội dung  
□ Đa kế thừa  
□ Hàm ảo  
□ Hàm thuần ảo  
□ Hàm hủy ảo  
□ Bài tập  
2
Thảo luận nhóm (4-5 người)  
□ Đơn kế thừa (Single Inheritance)  
o Thuộc tính và phương thức tĩnh có được kế  
thừa ở lớp kế thừa (lớp dẫn xuất) không? Tại  
sao?  
□ Đa kế thừa (multiple inheritance)  
o Những trường hợp nào thì đa kế thừa có vấn  
đề? Cho ví dụ minh họa.  
o Những vấn đề đó là gì?  
o Cách giải quyết?  
3
Đa kế thừa  
□ Nếu đơn kế thừa có thể giải quyết tốt cho  
các bài toán khác nhau, tại sao không cho  
phép đa kế thừa?  
4
Tree, DAGs, và Diamonds  
□ Sơ đồ kế thừa có dạng như một đồ thị  
o Mỗi nút tương ứng với một lớp đối tượng  
o Cạnh biểu thị cho quan hệ giữa lớp cơ sở và  
lớp kế thừa  
o Đơn kế thừa: tạo ra cấu trúc cây  
o Đa kế thừa: tạo ra DAGs  
A
C
B
D
E
5
Vấn đề hình thoi  
□ Diamonds  
o Với đa kế thừa, dễ thấy rằng Y là lớp  
được kế thừa chuyển tiếp của lớp cơ sở X.  
o Điều gì xảy ra khi các lớp V, Z định nghĩa  
cùng một hành vi m hay thuộc tính f?  
X
V W  
VD: Artists, Cowboys, ArtistCowboys  
ØTất cả đều có phương thức draw  
Z
ØPhương thức draw nào sẽ được đối tượng  
gọi xử lý? Y sẽ kế thừa phương thức m từ  
Y
lớp đối tượng nào?  
6
Vấn đề hình thoi – Phương thức  
□ Sẽ như thế nào nếu phương thức m được  
Z cài đặt nạp chồng lại nhưng V thì  
không?  
X
□ Một vài cách giải quyết  
o Sử dụng chỉ dẫn Z::m  
o Không sử dụng các p.thức và  
thuộc tính gây nhập nhằng ở Z  
V W  
o Lớp kế thừa có thể cài đặt nạp chồng  
Z
Phương thức m.  
Y
7
Vấn đề hình thoi – Thuộc tính  
□ Tương tự cho thuộc tính trong đa kế thừa:  
có một hay nhiều thuộc tính f nếu vấn đề  
hình thoi xảy ra?  
o Kế thừa thành nhiều thuộc tính f:  
X
Artist::draw và Cowboy::draw sử dụng các  
thuộc tính f này một cách khác nhau.  
V W  
□ C++ cung cấp cả hai dạng kế thừa  
đa và đơn thuộc tính  
Z
o Hai thuộc tính luôn được thừa kế xuống  
lớp con, để chỉ một thuộc tính được kế thừa  
Y
xuống lớp con. Hãy khai báo ở lớp cơ sở chung.  
8
Java-style Interfaces  
□ Trong Java có thể định nghĩa ra các  
interfaces và các lớp đối tượng sẽ hiện  
thực các interfaces này.  
o Interface mô tả các phương thức và các kiểu  
dữ liệu  
o Interface là kiểu dữ liệu – chương trình có thể  
sử dụng khai báo như biến hoặc tham số.  
o Giá sử lớp đối tượng A được bổ nghĩa bởi  
interface IObj, các thể hiện của A có thể sử  
dụng kiểu biến IObj để khai báo biến. Nhưng  
cần cài đặt mọi thứ đã khai báo trong IObj.  
9
No interface in C++  
□ C++ cho phép các phương thức và lớp đối  
tượng được khai báo ở mức trừu tượng (sử  
dụng từ khóa abstract)  
o Khai báo trong lớp và không phải cài đặt (giống Java)  
o Trong C++, được gọi là phương thức thuần ảo (pure  
virtual method)  
□ Lớp trừu tượng có thể được sử dụng kế thừa  
nhưng không được phép tạo lập thể hiện.  
□ Do đó, một lớp đối tượng có thể đa kế thừa từ  
nhiều lớp trừu tượng (giống Java)  
□ Có nên thực hiện đa kế thừa?  
10  
Nội dung  
□ Đa kế thừa  
□ Hàm ảo  
□ Hàm thuần ảo  
□ Hàm hủy ảo  
□ Bài tập  
11  
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);  
12  
Hàm ảo  
□ Ví dụ:  
class Animal  
{
public:  
void talk() { cout << “Don’t talk!”; }  
Animal  
+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!”; }  
};  
13  
Hàm ảo  
void main()  
{
□ Ví dụ:  
void giveATalk(Animal *p)  
Animal a;  
Cat c;  
Dog d;  
{
}
p->talk();  
Animal *p;  
p = &a;  
p->talk();  
void main()  
{
Animal talks!!  
Cat c;  
Dog d;  
p = &c;  
Animal talks!!  
Animal talks!!  
();  
Animal talks!!  
giveATalk(&c);  
giveATalk(&d);  
p = &d;  
Animal talks!!  
();  
}
}
14  
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 <Chữ ký hàm>;  
15  
Hàm ảo  
□ Ví dụ:  
class Animal  
{
public:  
virtual void 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!”; }  
};  
16  
Hàm ảo  
void main()  
{
□ Ví dụ:  
void giveATalk(Animal *p)  
Animal a;  
{
}
Cat  
Dog  
c;  
d;  
p->talk();  
Animal *p;  
p = &a;  
p->Talk();  
void main()  
{
Animal talks!!  
Cat c;  
Dog d;  
p = &c;  
p->Talk();  
Cat talks!!  
Dog talks!!  
Cat talks!!  
giveATalk(&c);  
giveATalk(&d);  
p = &d;  
->Talk();  
Dog talks!!  
}
}
17  
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)  
void giveATalk(Animal obj, int  
{
iType)  
p->talk();  
}
{
if (iType == 0)  
{
Cat c = (Cat)obj;  
c.talk();  
}
else if (iType == 1)  
{
Dog d = (Dog)obj;  
d.talk();  
}
18  
}
Nội dung  
□ Đa kế thừa  
□ Hàm ảo  
□ Hàm thuần ảo  
□ Hàm hủy ảo  
□ Bài tập  
19  
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!!  
20  
Tải về để xem bản đầy đủ
pdf 30 trang myanh 24240 Free
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Lập trình hướng đối tượng - Tuần 10: Thảo luận một số vấn đề về kế thừa - Nguyễn Khắc Huy", để 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_lap_trinh_huong_doi_tuong_tuan_10_thao_luan_mot_so.pdf