và chi tiết cài đặt của lớp List, nhưng không bị trở thành List vì sử dụng kế thừa private. Các thao tác của List không bị kế thừa xuống lớp con Stack và Set.
Kế thừa private
• Một số hàm thành phần của lớp cơ sở List có thể cần thiết ở lớp con như hàm Empty trong lớp Stack, hàm Empty, IsMember, Count trong lớp Set… Ta định nghĩa lại những hàm này bằng cách gọi lại phiên bản trong lớp List.
• Một cách thay thế việc viết lại hàm như trên là khai báo lại các danh hiệu này trong phần public của lớp con.
class Stack:private List {
public:
Stack():List() {}
bool Push(Item x) {Insert(x); return true;} bool Pop(Item *px);
List::Empty; // access specifier };
• Khai báo trên chỉ rõ rằng danh hiệu Empty trong lớp List trở thành public trong lớp Stack.
Kế thừa private
• Ta có thể làm tương tự cho lớp Set.
class Set:private List { public:
Set():List(){}
void Add(Item x) {
if (!List::IsMember(x)) Insert(x); }
List::Empty(); // access specifier List::IsMember;
List::Count; List::View; };
• Ta dùng kế thừa private trong các trường hợp muốn tận dụng mã chương trình chung và có thể muốn kế thừa một phần nhưng
không phải tất cả các thao tác của lớp cơ sở. Sau đây là một vài ví dụ:
Kế thừa private
class Diem { double x,y; public:
Diem(double xx = 0, double yy = 0):x(xx),y(yy){} void TinhTien(double dx, double dy);
friend Diem operator + (Diem d); friend Diem operator - (Diem d); //...
};
class HinhTron: { double r; public:
HinhTron(double tx, double ty, double rr):Diem(tx,ty),r(rr){}
void Ve(int color) const;
void TinhTien(double dx, double dy) const; };
class MangDiem { int n, size; Diem *pd;
void Init(int nn, int sz, Diem *data = NULL); public:
MangDiem(){Init(0,10);}
MangDiem(int nn, int sz, Diem *data = NULL) {Init(nn,sz,data);}
MangDiem(const MangDiem &md); ~MangDiem() {delete [] pd;}
MangDiem &operator = (const MangDiem &d); void Them(Diem d);
MangDiem operator + (Diem d) const; MangDiem& operator += (Diem d);
MangDiem operator + (const MangDiem md) const; MangDiem& operator += (MangDiem md) const;
MangDiem& operator << (Diem d); Diem &operator [] (int i);
Diem operator [] (int i) const; //..
Kế thừa private
Diem dd[] = {Diem(100,100), Diem(200,200), Diem(200,50)};
class DaGiac:MangDiem { public:
DaGiac():MangDiem(3,3,dd){}
DaGiac(int sd, Diem *pd):MangDiem(sd,sd,pd){} DaGiac(const DaGiac &d):MangDiem(d){}
DaGiac& operator = (const DaGiac &d); void Ve(int color) const;
void Quay(Diem Tam, double goc);
void TinhTien(double dx, double dy) const; Diem TrongTam() const;
//...}; };