Tải bản đầy đủ (.ppt) (9 trang)

Hướng đối tượng - Đa thừa kế

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.28 MB, 9 trang )

Sự kết nối động
I. Tính đa thừa kế
I. Tính đa thừa kế

Đa thừa kế là cách tạo một class mới
Đa thừa kế là cách tạo một class mới
từ nhiều class cơ sở.
từ nhiều class cơ sở.
#include <iostream.h>
#include <conio.h>
class base1
{public: void a(void); }
class base2
{public: void b(void); }
class derived: public base1,base2
{public: void c(void);} derived_object;
Các quy tắc thừa kế và truy cập của cơ chế đa
thừa kế cũng giống như tính đơn thừa kế.
Sự kết nối động
II. Constructor và tính đa thừa kế.
II. Constructor và tính đa thừa kế.

Khi một đối tượng thuộc một lớp đa thừa kế được khởi tạo
Khi một đối tượng thuộc một lớp đa thừa kế được khởi tạo
nó sẽ lần lượt gọi đến các constructor của các lớp cha theo
nó sẽ lần lượt gọi đến các constructor của các lớp cha theo
thứ tự khai báo mà nó được thừa kế từ đó.
thứ tự khai báo mà nó được thừa kế từ đó.
Ví dụ:
#include <iostream.h>
#include <conio.h>


class base1 {public: base1(void);};
class base2 {public: base2(void);};
class derived: public base1,base2
{public:derived(void);} derived_object;
base1:: base1(void) {cout <<‘a’;}
base2:: base2(void) {cout <<‘b’;}
derived:: derived(void) {cout <<‘c’;}
main()
{getche(); return 0;}
Kết quả trên màn hình sẽ là: abc.
Sự kết nối động
III. Sự không rõ ràng trong tính đa thừa kế.
III. Sự không rõ ràng trong tính đa thừa kế.

Nếu trong ít nhất hai trong các lớp cha có sự trùng lặp về
Nếu trong ít nhất hai trong các lớp cha có sự trùng lặp về
tên các dữ liệu hoặc hàm thì trình biên dịch sẽ không thể
tên các dữ liệu hoặc hàm thì trình biên dịch sẽ không thể
xác định được sẽ gọi đến thành viên nào! Do đó chính lập
xác định được sẽ gọi đến thành viên nào! Do đó chính lập
trình viên cần sử dụng toán tử phân giải hoạt vi để xác định
trình viên cần sử dụng toán tử phân giải hoạt vi để xác định
thành viên nào cần gọi.
thành viên nào cần gọi.
Biện pháp Ví dụ 28:
Trường hợp gây ra lỗi:
class Alpha {public: void display();};
class Beta {public: void display();};
class Gamma: public Alpha, public Beta
{};

Void main()
{
Gamma::obj;
obj.display;
}
Ambiguous,
Alpha::display OR
Beta::display
Sự kết nối động
IV. Đa thừa kế với một cơ sở chung
IV. Đa thừa kế với một cơ sở chung

Có khả năng một class sẽ được dùng làm class cơ sở hơn
Có khả năng một class sẽ được dùng làm class cơ sở hơn
một lần. Hình ảnh sau đây cho thấy khả năng đó:
một lần. Hình ảnh sau đây cho thấy khả năng đó:
PERSON
TEACHER
STUDENT
TeachingAsitant
Mỗi lớp TEACHER và STUDENT
đều chứa một bản sao của lớp
PERSON. Do lớp
TeachingAssistant được phái
sinh từ các lớp TEACHER và
STUDENT giờ đây lại chứa hai
bản sao của lớp PERSON, gây
ra rất nhiều sự mơ hồ cho trình
biên dịch.
BIỆN PHÁP: SỬ DỤNG LỚP CƠ SỞ ẢO

PERSON
Sự kết nối động
V. Các lớp cơ sở ảo
V. Các lớp cơ sở ảo
class window{protected: int basedata;};
class border: public window{};
class menu: public window{};
class border_and_menu: public border, public menu
{public: int show() {return basedata;}}
class window {protected: int basedata;};
class border: virtual public window{};
class menu: virtual public window{};
class border_and_menu: public border,
public menu
{public: int show() {return basedata;}}
TEACHER
STUDENT
TeachingAsitant
PERSON
Gây ra lỗi.
Khắc phục: Sử
dụng lớp cơ sở ảo

×