Chương 6 Tương ứng bội và phương thức ảo Phương thức ảo và tương ứng bội - Pdf 70

Phương thức ảo và tương ứng bội
3.1. Cách định nghĩa phương thức ảo
Giả sử A là lớp cơ sở, các lớp B, C, D dẫn xuất (trực tiếp hoặc dán tiếp) từ A. Giả sử trong 4
lớp trên đều có các phương thức trùng dòng tiêu đề (trùng kiểu, trùng tên, trùng các đối). Để
định nghĩa các phương thức này là các phương thức ảo, ta chỉ cần:
+ Hoặc thêm từ khoá virtual vào dòng tiêu đề của phương thức bên trong định nghĩa lớp cơ
sở A.
+ Hoặc thêm từ khoá virtual vào dòng tiêu đề bên trong định nghĩa của tất cả các lớp A, B,
C và D.
Ví dụ:
Cách 1:
class A
{
...
virtual void hien_thi()
{
cout << “\n Đây là lớp A” ;
};
} ;
class B : public A
{
...
void hien_thi()
{
cout << “\n Đây là lớp B” ;
};
} ;
class C : public B
{
...
void hien_thi()

class C : public B
{
...
virtual void hien_thi()
{
cout << “\n Đây là lớp C” ;
};
} ;
class D : public A
{
...
virtual void hien_thi()
{
cout << “\n Đây là lớp D” ;
};
} ;
Chú ý: Từ khoá virtual không được đặt bên ngoài định nghĩa lớp. Ví dụ nếu viết như sau là
sai (CTBD sẽ báo lỗi).
class A
331 332
{
...
virtual void hien_thi() ;
} ;
virtual void hien_thi() // Sai
{
cout << “\n Đây là lớp A” ;
};
Cần sửa lại như sau:
class A

C c ; // c là biến đối tượng kiểu C
D d ; // d là biến đối tượng kiểu D
Xét lời gọi tới các phương thức ảo hien_thi sau:
p = &a; // p trỏ tới đối tượng a của lớp A
p->hien_thi() ; // Gọi tới A::hien_thi()
p = &b; // p trỏ tới đối tượng b của lớp B
p->hien_thi() ; // Gọi tới B::hien_thi()
p = &c; // p trỏ tới đối tượng c của lớp C
p->hien_thi() ; // Gọi tới C::hien_thi()
p = &d; // p trỏ tới đối tượng d của lớp D
p->hien_thi() ; // Gọi tới D::hien_thi()
3.3. Tương ứng bội
Chúng ta nhận thấy cùng một câu lệnh
p->hien_thi();
tương ứng với nhiều phương thức khác nhau. Đây chính là tương ứng bội. Khả năng này rõ
ràng cho phép xử lý nhiều đối tượng khác nhau, nhiều công việc, thậm chí nhiều thuật toán
khác nhau theo cùng một cách thức, cùng một lược đồ. Điều này sẽ được minh hoạ trong các
mục tiếp theo.
3.4. Liên kết động
Có thể so sánh sự khác nhau giữ phương thức tĩnh và phương thức ảo trên khía cạnh liên kết
một lời gọi với một phương thức. Trở lại ví dụ trong 3.2:
A *p ; // p là con trỏ kiểu A
A a ; // a là biến đối tượng kiểu A
B b ; // b là biến đối tượng kiểu B
C c ; // c là biến đối tượng kiểu C
D d ; // d là biến đối tượng kiểu D
Nếu hien_thi() là các phương thức tĩnh, thì dù p chứa địa chỉ của các đối tượng a, b, c hay d,
thì lời gọi:
p->hien_thi() ;
luôn luôn gọi tới phương thức A::hien_thi()

+ Tuy nhiên cần chú ý là: Không cho phép gán địa chỉ đối tượng của lớp cở sở cho con trỏ
của lớp dẫn xuất. Như vậy ví dụ sau là sai:
B *q ;
A a ;
q = &a;
Sai vì: Gán địa chỉ đối tượng của lớp cơ sở A cho con trỏ của lớp dẫn xuất B
3.6. Ví dụ
Ta sửa chương trình trong
§
1 bằng cách định nghĩa các phương thức xuat() là ảo. Khi đó
bốn câu lệnh:
hien(&a);
hien(&b);
hien(&c);
hien(&d);
trong hàm main (của chương trình dưới đây) sẽ lần lượt gọi tới 4 phương thức khác nhau:
A::xuat()
B::xuat()
C::xuat()
D::xuat()
//CT6-01B
// Phuong thuc ảo và tương ứng bội
#include <conio.h>
335 336


Nhờ tải bản gốc

Tài liệu, ebook tham khảo khác

Music ♫

Copyright: Tài liệu đại học © DMCA.com Protection Status