Tải bản đầy đủ (.docx) (3 trang)

Phạm vi truy nhập đến các thành phần của lớp cơ sở

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 (59.78 KB, 3 trang )

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 thừa kế tất cả các thành phần của lớp cơ sở, nhưng trong lớp
dẫn xuất không thể truy nhập tới tất cả các thành phần này. Giải pháp thường dùng là sử dụng
các phương thức của lớp cở sở để truy nhập đến các thuộc tính của chính lớp cơ sở đó. Cũng
có thể sử dụng các giải pháp khác dưới đây.
+ Các thành phần private của lớp cở sở không cho phép truy nhập trong lớp dẫn xuất.
+ Các thành phần public của lớp cơ sở có thể truy nhập bất kỳ chỗ nào trong chương trình.
Như vậy trong các lớp dẫn xuất có thể truy nhập được tới các thành phần này.
+ Các thành phần khai báo là protected có phạm vi truy nhập rộng hơn so với các thành
phần private, nhưng hẹp hơn so với các thành phần public. Các thành phần protected của một
lớp chỉ được mở rộng phạm vi truy nhập cho các lớ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á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 và
protected của lớp dẫn xuất theo kiểu public.
+ 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 private của
lớ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ớp cở để xây dựng lớp C. Thì trong C có thể truy nhậ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 truy nhậ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


// Pham vi truy nhap
#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.

×