Kế thừa C++

Một trong những đặc tính quan trọng nhất của OOP là kế thừa. Ưu điểm của đặc tính kế thừa: sử dụng lại các đoạn code đã có trong chương trình 1 cách hiệu quả.

Khi tạo 1 class, thay vì việc viết 1 class mới hoàn toàn, người lập trình viên có thể kế thừa một số thuộc tính và phương thức từ 1 class đã có trong project. Class đã có trước đấy gọi là lớp cơ sở (Base Class), class kế thừa từ Base Class gọi là lớp dẫn xuất (Derived Class).

Khai báo lớp dẫn xuất kế thừa từ lớp cơ sở

class [Lớp dẫn xuất] : [Kiểu kế thừa] [Lớp cơ sở]
{
public:
    ...
protected:
    ...
private:
    ...
};

 

Lớp dẫn xuất kế thừa tất cả các phương thức của lớp cơ sở ngoại trừ:

– Hàm tạo, hàm hủy và hàm tạo copy
– Chồng toán tử của lớp cơ sở
– Hàm bạn của lớp cơ sở

 

[Kiểu kế thừa]: là private, public hoặc protected
– Kế thừa Public:

+ Thành phần(thuộc tính + phương thức) public của lớp cơ sở trở thành thành phần public của lớp dẫn xuất.
+ Thành phần(thuộc tính + phương thức) protected của lớp cơ sở trở thành thành phần protected của lớp dẫn xuất.
+ Không thể truy cập trực tiếp thành phần(thuộc tính + phương thức) private của lớp cơ sở từ lớp dẫn xuất. Nhưng có thể truy cập thành phần private thông qua việc gọi thành phần public của lớp cơ sở.

– Kết thừa Protected:

+ Thành phần(thuộc tính + phương thức) protected và public của lớp cơ sở trở thành thành phần protected của lớp dẫn xuất.

– Kế thừa Private:

+ Thành phần(thuộc tính + phương thức) protected và public của lớp cơ sở trở thành thành phần private của lớp dẫn xuất.

Recommendation: Kế thừa kiểu private và protected ít khi được sử dụng, chủ yếu sử dụng kế thừa kiểu public

Ví dụ 1: Viết lớp điểm gồm 2 thuộc tính tọa độ x, y. Sau đó viết thêm lớp hình tròn kế thừa từ lớp điểm.

#include <iostream>

using namespace std;

//Base class
class CPoint
{
private:
    double x, y;
public:
    CPoint(double mx, double my);
    void disPoint();
};

CPoint::CPoint(double mx, double my)
{
    x = mx;
    y = my;
}

void CPoint::disPoint()
{
    cout << "(x, y) = " << "(" << x << "," << y << ")\n";
}

//Derived class
class CCIRCLE : public CPoint
{
private:
    double r;
public:
    CCIRCLE(double mx, double my, double mr);
    void disR();
};

CCIRCLE::CCIRCLE(double mx, double my, double mr) : CPoint(mx, my)
{
    r = mr;
}

void CCIRCLE::disR()
{
    cout << "r = " << r << "\n";
}

void main()
{
    CCIRCLE oCircle(4.0, -5.0, 9.0);
    oCircle.disPoint();
    oCircle.disR();
    system("pause");
}

Kết quả:

Lớp hình tròn kế thừa từ lớp điểm
Lớp hình tròn kế thừa từ lớp điểm

Be the first to comment

Leave a Reply