Sự kế thừa và các vấn đề liên quan- Phần 2

Xem thêm bài Sự kế thừa và các vấn đề liên quan- Phần 1
Trích:
• When a base class is inherited by use of public, its public members become public members of the derived class, and its protected members become protected members of the derived class.

• When a base class is inherited by use of protected, its public and protected members become protected members of the derived class.

• When a base class is inherited by use of private, its public and protected members become private members of the derived class.

• In all cases, private members of a base class remain private to the base class, and are not inherited.
Ở đây mình xin nêu những điểm ở bên ngoài thôi nhé: (chỉ nói về public và private, protected thì tương tự)

Sự kế thừa public:
Bạn xem thử 1 ví dụ:

Khi khai báo:
class alpha{};
      class  beta: public alpha{};
Và hàm void func(alpha a){}
Trong void main() ta viết:
Alpha a;
Beta b;
a=b;     //Đối tượng b được truyền vào a. Trường hợp ngược lại thì không.
func(b);            //Chấp nhận.
Ở đây câu lệnh: a=b được chấp nhận vì b là 1 loại đối tượng của a. Tương tự, chúng ta có thể truyền một đối tượng lớp dẫn xuất cho một hàm có đối số lớp cơ sở.
Lưu ý: câu lệnh b=a; không được vì a không phải là 1 loại đối tượng của b.
Sự kế thừa private:
Khi bạn viết
class beta: private alpha{};
Bạn sẽ không thể sử dụng bất kì biến hoặc hàm nào trong alpha dù được khai báo public.
Kết quả là toàn bộ lớp cơ sở ẩn đối với các đối tượng của lớp dẫn xuất. Đối với các lớp dẫn xuất có thể coi như không có lớp cơ sở.
Tốt hơn hết là bạn thay thế sự kế thừa private bằng sự hợp thành. (Bài trước mình đã nêu)
class alpha{};
class beta
{
    private:
                alpha obj;
};
Đối tượng alpha được đặt ở chế độ private nên nó vẫn che đậy đối với đối tượng beta. Sự hợp thành làm cho mối quan hệ 2 lớp rõ ràng hơn, ít phức tạp hơn và đối với lớp dẫn xuất cũng làm việc như vậy. Mình thử nêu 2 ví dụ:
Ví dụ 1: Kế thừa private
#include
using namespace std;
class alpha
{
      public:
      alpha()
      {      cout<<"Alpha\n";    } 
      void hello()
      {
           cout<<"Hello\n";    
      }
};
class beta: private alpha
{
      public:
      beta()
      {     cout<<"Beta\n";
            hello();
      }
};

int main()
{
    beta b;
    //b.hello();      Không hợp lệ vì class beta xem hello là phương thức private
    system("PAUSE");  
}
Ví dụ 2: Sự hợp thành
class alpha{/*....*/};
class beta
{
    private:
             alpha a;
    public:
             /*..
             a.hello();   //Sẽ rõ ràng hơn ví dụ 1
            ..*/
};

Nhận xét

Bài đăng phổ biến từ blog này

Kinh nghiệm tạo biểu đồ Use Case

PHÉP TOÁN XOR

Phần mềm hỗ trợ vẽ bản đồ tư duy trên máy tính

Power Designer 12.5