7. Lớp cơ sở ảo
n Xét trường hợp:
q Giả sử trong lớp A có thành phần x
q Trong lớp B cũng có thành phần x
q Xây dựng lớp C kế thừa từ lớp A và B
n Theo nguyên lý kế thừa: trong C sẽ có hai thành phần x
n Vấn đề xảy ra:
q Khi truy cập thành phần x trong C thì chương trình dịch không biết thành phần x đó là của lớp A hay B
n à Sự nhập nhằng trong kế thừa
n Để giải quyết:
q Ta xác định phạm vi tường minh
q Ví dụ:
C c; c.A::x; hoặc c.B::x;
n Giải quyết:
q Khai báo tường minh
<tên đối tượng>.<tên lớp cơ sở>::<tên thành phần>;
q Coi A là lớp cơ sở ảo của cả B và C
Khi đó trong D chỉ có một sự thể hiện của A
n Khai báo:
class <tên lớp dẫn xuất>: virtual <kiểu dẫn xuất><lớp cơ sở>
n Khi đó ta khai báo
class B: virtual public A{…}
class C: virtual public A{…}
1. Khái niệm
Kết gán sớm và kết gán muộn
Khi đối tượng nhận một thông báo thực hiện một phương thức, hệ thống sẽ:
Kiểm tra cú pháp của thông báo
Gắn thông báo đó với 1 định nghĩa hàm cụ thể
Việc kết gán có thể xảy ra ở hai thời điểm:
• Lúc biên dịch chương trình à Kết gán sớm
• Lúc chạy chương trình à Kết gán muộn
2. Phương thức ảo
n Định nghĩa:
q Hàm ảo là hàm thành phần của lớp
q Được khai báo trong lớp cơ sở và định nghĩa lại trong lớp dẫn xuất
n Cú pháp
virtual <kiểu trả về> <tên hàm>([tsố])
n Một số chú ý:
q Định nghĩa các phương thức áo như các phương thức thông thường
q Sử dụng con trỏ để truy cập tới hàm ảo
q Định nghĩa trong lớp cơ sở ngay cả khi nó không được sử dụng
q Không có hàm khởi tạo ảo nhưng có thể có hàm huỷ ảo
q Con trỏ của lớp cơ sở có thể chứa địa chỉ của đối tượng lớp dẫn xuất
n Cơ chế kết gán muộn:
q Khi một lớp có phương thức ảo hoặc lớp cơ sở có phương thức áo
q Chương trình dịch sẽ phát sinh thêm một con trỏ ảo (virtual pointer)
q Con trỏ này trỏ tới một bảng ảo (Vtable)
q Bảng ảo có chứa địa chỉ của các phương thức ảo
n Quá trình phát sinh một đối tượng lớp dẫn xuất:
q B1: xác định các thành phần ( ko ảo) kể cả cả các thành phần của lóp cơ sở
q Bước 2: Xây dựng con trỏ ảo và bảng áo
n Khi kết gán muộn, căn cứ vào con trỏ ảo để xác định phương thức trong bảng ảo và phương thức của lớp dẫn xuất
n Xây dựng lớp giáo viên và sinh viên kế thừa từ lớp người
NGUOI
{
- ht,namsinh
- nhap, in
- loai(){returrn 0};
}
SV:NGUOI
{
-lop,dtb
-nhap, in
-loai(){ return 1;}
}
GV:NGUOI
{
-hsl, dv
-nhap,in
-loai(){return 2;}
}
Chú ý:
n Cơ chế kết gán phương thức ảo chỉ có thể thực hiện qua phép gán con trỏ hoặc tham chiếu
NGUOI a,*p;
GV b;
a=b;
a.nhap(); //kết gán sớm
p=&b;
pànhap(); //kết gán muộn
NGUOI &q=b;
qànhap(); //kết gán muộn
void f(NGUOI x)
{ x.nhap(); //kết gán sớm}
void f(NGUOI &x)
{ x.nhap(); //kết gán muộn }
3. Phương thức ảo thuần tuý
n Mục đích:
q Tránh lãng phí bộ nhớ
q Cung cấp một phương thức thống nhất làm giao diện chung.
n Khai báo:
virtual <kiểu trả về> <tên phương thức>([tsố])=0;
n Đặc điểm:
q Không bắt buộc định nghĩa trong lớp cơ sở
q Không thể khai báo đối tượng thuộc lớp có phương thức ảo thuần tuý
q Lớp có phương thức ảo thuần tuý chỉ làm lớp cơ sở cho lớp khác và gọi là lớp cơ sở trừu tượng
q Lớp dẫn xuất kế thừa lớp cơ sở trừu tượng mà không định nghĩa lại phương thức ảo thuần tuý à nó trở thành lớp cơ sở trừu tượng
Bạn đang đọc truyện trên: truyentop.pro