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 đủ
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:
bai_giang_lap_trinh_huong_doi_tuong_tuan_10_thao_luan_mot_so.pdf

