Phạmvitruynhậpđến các thànhphầncủa lớp cơsở 3.1. Các từ khoá quy định phạmvitruynhậpcủalớpcơsở + Mặc dù lớp dẫn xuất được thừa kế tất cả các thànhphầncủa lớp cơ sở, nhưng trong lớp dẫn xuất không thể truynhập tới tất cả cácthànhphần này. Giải pháp thường dùng là sử dụng các phương thức củalớpcởsở để truynhậpđếncác thuộc tính của chính lớpcơsở đó. Cũng có thể sử dụng các giải pháp khác dưới đây. + Cácthànhphần private củalớpcởsở không cho phép truynhập trong lớp dẫn xuất. + Cácthànhphần public củalớpcơsởcó thể truynhập bất kỳ chỗ nào trong chương trình. Như vậy trong cáclớp dẫn xuất có thể truynhập được tới cácthànhphần này. + Cácthànhphần khai báo là protected cóphạmvitruynhập rộng hơn so với cácthànhphần private, nhưng hẹp hơn so với cácthànhphần public. Cácthànhphần protected của một lớp chỉ được mở rộng phạmvitruynhập cho cáclớp dẫn xuất trực tiếp từ lớp này. 3.2. Hai kiểu dẫn xuất Có 2 kiểu dẫn xuất là private và public, chúng cho cácphạmvitruynhập khác nhau tới lớpcơ sở. Cụ thể như sau: + Cácthànhphần public và protected củalớpcơsở sẽ trở thành cácthànhphần public và protected củalớp dẫn xuất theo kiểu public. + Cácthànhphần public và protected củalớpcơsở sẽ trở thành cácthànhphần private củalớp dẫn xuất theo kiểu private. Ví dụ : Giả sử lớp A có: thuộc tính public a1 thuộc tính protected a2 và lớp B dẫn xuất public từ A, thì A::a1 trở thành public trong B, A::a2 trở thành protected trong B. Do đó nếu dùng B làm lớpcở để xây dựng lớp C. Thì trong C có thể truynhập tới A::a1 và A::a2. Thế nhưng nếu sửa đổi để B dẫn xuất private từ A, thì cả A::a1 và A::a2 trơ thành private trong B, và khi đó trong C không được phép truynhập tới các thuộc tính A::a1 và A::a2. Để biết tường tận hơn, chúng ta hãy biên dịch chương trình: //CT5-04 // Phamvitruynhap #include <conio.h> #include <iostream.h> #include <string.h> class A { protected: int a1; public: 251 252 int a2; A() { a1=a2=0; } A(int t1, int t2) { a1=t1; a2= t2; } void in() { cout << a1 <<" " << a2 ; } } ; class B: private A { protected: int b1; public: int b2; B() { b1=b2=0; } B(int t1, int t2, int u1, int u2) { a1=t1; a2=t2; b1=u1;b2=u2; } void in() { cout << a1 <<" " << a2 << " " << b1 << " " << b2; } } ; class C : public B { public: C() { 253 254 b1=b2=0; } C(int t1, int t2, int u1,int u2) { a1=t1; a2=t2; b1=u1;b2=u2; } void in() { cout << a1; cout <<" " << a2 << " " << b1 << " " << b2; } }; void main() { C c(1,2,3,4); c.in(); getch(); } Chúng ta sẽ nhận được 4 thông báo lỗi sau trong lớp C (tại hàm tạo có đối và phương thức in): A::a1 is not accessible A::a2 is not accessible A::a1 is not accessible A::a2 is not accessible Bây giờ nếu sửa đổi để lớp B dẫn xuất public từ A thì chương trình sẽ không có lỗi và làm việc tốt. . Phạm vi truy nhập đến các thành phần của lớp cơ sở 3.1. Các từ khoá quy định phạm vi truy nhập của lớp cơ sở + Mặc dù lớp dẫn xuất được. chúng cho các phạm vi truy nhập khác nhau tới lớp cơ sở. Cụ thể như sau: + Các thành phần public và protected của lớp cơ sở sẽ trở thành các thành phần public