- Back to Home »
- CPP »
- C++ Inheritance
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:
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
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
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)
+ 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ó pub, pro được access, pri không được vì là private
+ Outsite class (Rect, Rect1, Rect2) : chỉ có pub là public 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 member và protected member của base class sẽ trở thành public và protected 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ở
multiple-inheritance.cpp
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ó pub, pro được access, pri không được vì là private
+ Outsite class (Rect, Rect1, Rect2) : chỉ có pub là public 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 member và protected member của base class sẽ trở thành public và protected 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; }