Saturday, May 2, 2015

1. Inheritance
Kế thừa là việc tạo ra class mới dựa vào một class nào đó có sẵn, lớp có sẵn được gọi là "Lớp cơ sở - Base class", lớp mới tạo ra gọi là "Lớp dẫn xuất - Derived class". Trong lớp dẫn xuất thừa hưởng một vài data & function member của lớp cơ sở tùy thuộc vào access modifiers của các member này và kiểu kế thừa mà sẽ được trình bày dưới đây.

2. Base & Derived class

Khai báo:
class derived-class: access-specifier base-class

Trong đó:
+ base-class : lớp cơ sở
+ derived-class : lớp dẫn xuất
+ access-specifier : kiểu kế thừa public, protected hay private

Ex:
inheritance.cpp
 #include <iostream>  
 using namespace std; 
 
 // Base class  
 class Shape   
 {  
 public:  
   void setPublic(int pub)  
   {  
     this->pub = pub;  
     cout << "setPublic: " << pub << endl;  
   }  
 protected:  
   void setProtected(int pro){  
     this->pro = pro;  
     cout << "setProtected: " << pro << endl;  
   }  
 private:  
   void setPrivate(int pri){  
     this->pri = pri;  
     cout << "setPrivate: " << pri << endl;  
   }  

 public:  
   int pub;  
 protected:  
   int pro;  
 private:  
   int pri;  
 }; 
 
 // Derived class  
 class Rectangle: public Shape  
 {  
 public:  
   int setValue()  
   {  
     pub = 10;    //public  
     pro = 5;     //protected  
     setPublic(10);  //public  
     setProtected(5); //protected  
     return 1;  
   }  
 };  

 class Rectangle1: protected Shape  
 {  
 public:  
   int setValue()  
   {  
     pub = 10;    //protected  
     pro = 5;     //protected  
     setPublic(10);  //protected  
     setProtected(5); //protected  
     return 1;  
   }  
 };  
 class Rectangle2: private Shape  
 {  
 public:  
   int setValue()  
   {  
     pub = 10;    //private  
     pro = 5;     //private  
     setPublic(10);   //private  
     setProtected(5);  //private  
     return 1;  
   }  
 };  

 int main(void)  
 {  
   Rectangle Rect;  
   Rectangle1 Rect1;  
   Rectangle2 Rect2;
   Rect.pub = 20;
   Rect.setPublic(10); //public  
   Rect.setValue(); 
 
   //Rect1.setPublic(10); //become protected  
   Rect1.setValue();  

   //Rect2.setPublic(10); //become private  
   Rect2.setValue();  

   return 0;  
 }  

3. Access control & Inheritance
Tùy vào khai báo access modifiers của các member trong base class mà chúng sẽ được access control trong dirived class theo bảng dưới đây

Access public protected private
Same class yes yes yes
Derived classes yes yes no
Outside classes yes no no

Derived class kế thừa:
+ Constructor & Destructor và Copy constructor của base class
+ Overloaded operators của base class
+ Friend function của base class

Theo ví dụ inheritance.cpp trên có khai báo trong Shape (base class)
  public:   
   int pub;   
  protected:   
   int pro;   
  private:   
   int pri;  

+ Same class (Shape) : pub, pro, pri được dùng bất kỳ vị trí nào trong Shape đều được
+ Derived class (Rectangle, Rectangle1, Rectangle2) : có  pubpro được access, pri không được vì là private
+ Outsite class (Rect, Rect1, Rect2) : chỉ có pubpublic member mới được truy cập

Tương tự như trên với các function.

4. Type of Inheritance

Có 3 kiểu kế thừa là public, protected, private; trong đó loại public thường được dùng nhất

+ Public inheritance: public memberprotected member của base class sẽ trở thành publicprotected member của derived class, private member của base class sẽ không được truy cập trưc tiếp trong derived class mà phải thông qua public hoặc protected member của base class.
Xem vd class Rectangle ở trên.
+ Protected inheritance: public member của base class sẽ trở thành protected member của derived class.
Xem vd class Rectangle1 ở trên.
+ Private inheritance: public member và protected member của base class đề trở thành private member của derived class.
Xem vd class Rectangle2 ở trên.

5. Multiple Inheritance
Đa kế thừa là việc tạo ra lớp dẫn xuất từ nhiều lớp cơ sở
class derived-class: access baseA, access baseB....
Ex:
multiple-inheritance.cpp
#include <iostream>
 
using namespace std;

// Base class Shape
class Shape 
{
   public:
      void setWidth(int w)
      {
         width = w;
      }
      void setHeight(int h)
      {
         height = h;
      }
   protected:
      int width;
      int height;
};

// Base class PaintCost
class PaintCost 
{
   public:
      int getCost(int area)
      {
         return area * 70;
      }
};

// Derived class
class Rectangle: public Shape, public PaintCost
{
   public:
      int getArea()
      { 
         return (width * height); 
      }
};

int main(void)
{
   Rectangle Rect;
   int area;
 
   Rect.setWidth(5);
   Rect.setHeight(7);

   area = Rect.getArea();
   
   // Print the area of the object.
   cout << "Total area: " << Rect.getArea() << endl;

   // Print the total cost of painting
   cout << "Total paint cost: $" << Rect.getCost(area) << endl;

   return 0;
}



Leave a Reply

Subscribe to Posts | Subscribe to Comments

- Copyright © Lập trình hệ thống nhúng Linux . Powered by Luong Duy Ninh -