Chương 4_Kế thừa C++ viện Điện Tử Truyền Thông Đại Học BK HN
Trang 1Chương 4: Kế thừa
Phần 2: Ngôn ngữ lập trình C++
Trang 2Các nội dung chính
Trang 3Các khái niệm cơ bản
Kế thừa (inheritance):
Lớp B kế thừa lớp A, tức là B sẽ có thể tái sử dụng các thành phần dữ liệu và các thao tác trong A
A
B
Lớp cha (lớp cơ sở)
Lớp con (lớp dẫn xuất)
Trang 5Phân loại kế thừa
Theo mức độ kế thừa: có 2 mức
Public: bảo toàn mức độ che dấu của các thành phần của
lớp cơ sở trong lớp dẫn xuất
Private: đưa các mức che dấu của các thành phần trong lớp
cơ sở lên mức private trong lớp dẫn xuất
Theo số lượng lớp cơ sở: có 2 loại
Kế thừa đơn
Kế thừa bội
Trang 6Cú pháp khai báo kế thừa
class C: <EA> A, <EB> B {
//Đ/n phần thân của lớp dẫn xuất
};
Trang 7Kế thừa đơn
Complex, trong đó lớp Complex kế thừa lớp Real
class Real { protected:
class Real { //tiếp từ hình bên Real Add(Real x){
Real z;
z.r = x.r +r;
return z;
} void Print(){
cout<<r;
} };
Trang 8Real::Print();
cout<<"+j"<<i;
} };
Trang 9c = d.Add(e);
cout<<"c="; c.Print();
cout<<endl;
return system("PAUSE"),EXIT_SUCCESS;
}
Trang 10Kết quả chạy
Trang 11Tính đa hình và hàm ảo
Ta thấy trong chương trình ở trên, trong hàm main
có các đối tượng của cả lớp Real và Complex Các đối tượng này đều có hàm thành viên Print() không
có tham số để in ra nội dung của từng đối tượng Do
đó, khi hàm main gửi thông báo Print cho các đối
tượng, yêu cầu hiển thị nội dung của chúng thì các
đối tượng đều gọi hàm Print để in nội dung của
chúng ra màn hình Do các đối tượng có các nội
dung khác nhau nên các nội dung in ra cũng khác
nhau Đây được gọi là sự đa hình, và hàm thành viên giống nhau cho nhiều lớp khác nhau được gọi là hàm
đa hình
Trang 12Tính đa hình
main()
:a Real Print()
:a Complex Print()
Kết quả chạy
Trang 15>Print(), hệ thống đã liên kết và gọi đến hàm Print của lớp Real, vì nó chỉ xét kiểu của con trỏ pr là kiểu Real, chứ không xét đến bản thân kiểu của đối tượng
mà pr đang trỏ đến Đây là hình thức liên kết sớm (early binding), được thực hiện vào lúc dịch chương trình
Trang 16Giải pháp cho vấn đề đa hình
(virtual)
Thêm từ khóa virtual
vào khai báo của hàm
Print trong lớp Real
Khi đó hàm Print trong
Trang 17Kết quả chạy lại
Trang 18Hàm ảo và cơ chế liên kết muộn
Khi gặp hàm ảo, thì hệ thống không thực hiện liên kết sớm khi dịch chương trình, mà chờ đến khi chạy chương trình, sau khi xác định rõ kiểu của đối tượng
mà thi hành hàm đó, thì việc liên kết mới được thực hiện, nhằm tìm đúng loại hàm cần thiết để thực hiện
Trang 19Lớp trừu tượng và hàm ảo thuần túy
có phần thân hàm)
thuần túy
Trang 20Abs class Number
virtual Print()=0
Trang 21Lớp trừu tượng
Một số quy tắc:
Lớp trừu tượng không có đối tượng, nó được dùng
để khái quát các thành phần chung nhất của các lớp
Có thể khai báo con trỏ kiểu lớp trừu tượng
Một hàm ảo thuần túy trong lớp trừu tượng cần phải được định nghĩa lại trong lớp dẫn xuất; hoặc tiếp tục
là hàm ảo trong lớp đó, khi đó lớp dẫn xuất này lại là trừu tượng
Trang 22Kế thừa bội
Trang 23Tóm tắt
Khái niệm cơ bản về kế thừa
Cách phân loại kế thừa
Tính đa hình và cách cài đặt
Sự khác nhau giữa hàm ảo và hàm thông thường
Lớp trừu tượng và hàm ảo thuần túy
Kế thừa bội
Trang 24Bài tập
Bài 1: Xây dựng cây các lớp số: gồm các lớp Number, Integer, Fraction, Real, Complex có nút gốc là lớp Number Mỗi lớp gồm các thao tác:
Số học: +,-,*,/
So sánh: <,>,==
Phép xuất ra màn hình <<
Bài 2: Xây dựng một cây các lớp hình: gồm các lớp Shape,
Rectangle, Square, Triangle, Quadrangle Mỗi lớp gồm các thao tác:
Hàm tạo, tạo ra một hình có tên cho trước
Tính diện tích
Tính chu vi
In ra màn hình nội dung của hình, gồm tên, loại hình, chu vi
và diện tích của nó
Trang 25Thank you!