cslt slide c5

Màu nền
Font chữ
Font size
Chiều cao dòng

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: Truyen2U.Pro