Tài liệu Lập trình hướng đối tượng & C++ - Chương 8: Thừa kế: THỪA KẾ
Chương 8
1
Nội dung
• Thừa kế ủơn
• Thừa kế bội
• Liờn kết tĩnh và liờn kết ủộng
2
Thừa kế ủơn
Khỏi niệm
Kế thừa từ cỏc lớp ủó cú từ trước.
=> Khụng phải ủịnh nghĩa nhiều. Thiết kế ủơn giản hơn.
Ích lợi: cú thể tận dụng lại
Cỏc thuộc tớnh chung
Cỏc hàm cú thao tỏc tương tự
• Khai bỏo
3
LỚP CHA
(Lớp cơ sở)
LỚP CON
(lớp dẫn xuất)
class
: {
// khai bỏo lớp con
};
• Dạng thừa kế
Lớp cơ sở Thừa kế public Thừa kế private Thừa kế protected
private _ _ _
public public private protected
protected protected private protected
Thừa kế ủơn
4
class A {
int x;
void Fx();
public:
int y;
void Fy();
protected:
int z;
void Fz();
};
// Thừa kế dạng private
class B : A {. };
// A là lớp cơ sở riờng của C
class C : private A { };
// A là lớp cơ sở chung của D
class D : public A { };
// A: lớp cơ sở ủược bảo vệ
class E : protected A {. };
• Quyền truy xuất trong lớp con
– Lớp con cú tất cả thành phần (thuộc tớnh + phương thức)
của l...
5 trang |
Chia sẻ: putihuynh11 | Lượt xem: 519 | Lượt tải: 0
Bạn đang xem nội dung tài liệu Lập trình hướng đối tượng & C++ - Chương 8: Thừa kế, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
THỪA KẾ
Chương 8
1
Nội dung
• Thừa kế đơn
• Thừa kế bội
• Liên kết tĩnh và liên kết động
2
Thừa kế đơn
Khái niệm
Kế thừa từ các lớp đã cĩ từ trước.
=> Khơng phải định nghĩa nhiều. Thiết kế đơn giản hơn.
Ích lợi: cĩ thể tận dụng lại
Các thuộc tính chung
Các hàm cĩ thao tác tương tự
• Khai báo
3
LỚP CHA
(Lớp cơ sở)
LỚP CON
(lớp dẫn xuất)
class
: {
// khai báo lớp con
};
• Dạng thừa kế
Lớp cơ sở Thừa kế public Thừa kế private Thừa kế protected
private _ _ _
public public private protected
protected protected private protected
Thừa kế đơn
4
class A {
int x;
void Fx();
public:
int y;
void Fy();
protected:
int z;
void Fz();
};
// Thừa kế dạng private
class B : A {. };
// A là lớp cơ sở riêng của C
class C : private A { };
// A là lớp cơ sở chung của D
class D : public A { };
// A: lớp cơ sở được bảo vệ
class E : protected A {. };
• Quyền truy xuất trong lớp con
– Lớp con cĩ tất cả thành phần (thuộc tính + phương thức)
của lớp cha.
– Khơng thể truy xuất thành phần private của lớp cha.
Thừa kế đơn
5
class Diem {
int x, y;
public:
void GanDiem(int h,int t)
{ x = h; y = t; }
void HienDiem()
class DiemMau : public
Diem {
int mau;
public:
void KTao(int h,int
t,int m)
{ GanDiem(h,t);
mau=m; }
void Hien()
Thừa kế đơn
6
{
cout<<“(”
<<x<<“,”<<y
<<“)”;}
void DoiDiem(int dx,
int dy)
{ x += dx; y += dy; }
...
};
{ HienDiem();
cout<<mau; }
...
};
void main() {
DiemMau a;
a.KTao(2,5,0);
a.HienDiem();
a.DoiDiem(7,8); a.Hien();
}
• Hàm xây dựng và hàm hủy
- Khi khởi tạo đối tượng: hàm xây dựng của lớp cha sẽ được
gọi trước, sau đĩ là hàm xây dựng của lớp con.
Trong hàm xây dựng của lớp con phải gọi hàm xây
dựng của lớp cha để khởi tạo thuộc tính của lớp cha
- Khi hủy bỏ đối tượng: hàm hủy của lớp con sẽ được
Thừa kế đơn
7
A
B
C
Khởi tạo Hủy bỏ
gọi trước, sau đĩ mới là hàm hủy của lớp cha.
• Hàm xây dựng và hàm hủy
class Diem {
int x, y;
public:
Diem()
{ x=y=0;}
Diem(int h, int t)
class DiemMau:public Diem {
int mau;
public:
DiemMau()
:Diem() { mau=0; }
DiemMau(int h,int t,int m)
Thừa kế đơn
8
{ x=h; y=t;}
Diem(const Diem& d)
{ x=d.x; y=d.y;}
...
};
:Diem(h,t) { mau=m; }
DiemMau(const DiemMau& d1)
:Diem(d1){ mau=d1.mau; }
...
};
void main() {
DiemMau a(2,5,3);
DiemMau b;
DiemMau c = a;
}
2
5
3
x
y
mau
a
Diem(2,5)
mau=3;
• Hàm xây dựng và hàm hủy
class SinhVien {
char mssv[9];
char* hoten;
int namsinh;
float diemtb;
public:
SinhVien() ;
class SinhVienNuocNgoai
: public SinhVien {
char* nuoc;
char sopassport[12];
public:
SinhVienNuocNgoai()
: SinhVien() {
nuoc = new char[30];
strcpy(sopassport,””);
}
SinhVienNuocNgoai(const
SinhVienNuocNgoai& s)
Thừa kế đơn
9
SinhVien(char*,char*,int,float);
SinhVien(const SinhVien&);
void operator=(const SinhVien&);
~SinhVien() { delete[] hoten; }
void Nhap();
void In();
...
};
//ðịnh nghĩa các hàm thành viên
: SinhVien(s) {
nuoc = strdup(s.nuoc);
strcpy( sopassport ,
s.sopassport);
}
~SinhVienNuocNgoai() {
delete[] nuoc;
}
...
};
• Tái định nghĩa dữ liệu thành viên
– Thuộc tính của lớp con trùng tên thuộc tính của lớp cha.
– Trong lớp con, nếu ta truy xuất đến dữ liệu trùng tên đĩ thì
sẽ truy xuất đến dữ liệu của lớp con.
– Truy xuất dữ liệu lớp cha : ::
class LopCha { LopCon::LopCon():LopCha()
Thừa kế đơn
10
public:
int a;
LopCha() { a= 0; }
};
class LopCon:public LopCha {
public:
int a;
LopCon();
void Hien();
};
{ a = 1; }
void LopCon::Hien()
{ cout << a << LopCha::a;
}
void main() {
LopCon x;
x.Hien();
cout << x.a
<< x.LopCha::a;
}
• Tái định nghĩa hàm thành viên
– Hàm thành viên của lớp con trùng tên với hàm thành viên
của lớp cha.
– Gọi hàm trùng tên => gọi hàm của lớp con.
– Gọi hàm của lớp cha : ::()
Thừa kế đơn
11
class Diem {
int x, y;
public:
...
void Hien()
{
cout<<“(”<<x<<“,”
void DiemMau :: Hien()
{
Diem::Hien();
cout<<“ mau ”<<mau;
}
Thừa kế đơn
12
<<y<<“)”;}
};
class DiemMau:public Diem{
int mau;
public:
void Hien();
...
};
void main() {
DiemMau a(2,5,4);
a.Hien();
a.DiemMau::Hien();
DiemMau b=a;
b.Diem::Hien();
}
Thừa kế bội
• Ưu điểm
– Tận dụng được những thành phần đã cĩ sẵn của lớp
cha:
• Dữ liệu thành viên
• Hàm thành viên
– Thuận lợi khi sử dụng kết hợp với hàm ảo.
13
SinhViên
SinhViênTạiChức
– mã số
NhânViên
– mã số
Dữ liệu của SinhViên
Dữ liệu của NhânViên
Dữ liệu của SinhViênTạiChức
Tạo ra đối tượng
Thừa kế bội
Vấn đề cần lưu ý khi sử dụng thừa kế bội
Cạnh tranh trong thừa kế bội.
Thiết kế sơ đồ thừa kế phải đúng ý nghĩa.
Nên hạn chế và cẩn thận khi sử dụng thừa kế bội.
14
class XeDien {
int loaibinhdien;
int thoigian;
float tocdo;
public:
XeDien() { }
XeDien(int b,
int tg, float td)
{ }
};
class XeDap {
char loai[10]; char* mau;
int chieucao;
public:
XeDap() { }
XeDap(char* l,char* m,int c){}
};
Thừa kế bội
15
class XeDapDien:public XeDap, public XeDien{
public:
XeDapDien();
XeDapDien( char*, char*, int ,
int , int , float );
};
XeDapDien::XeDapDien ():XeDap(), XeDien(){ }
XeDapDien::XeDapDien ( char* a, char* b,
int c, int d, int e, float f )
: XeDap(a, b, c), XeDien(d,e,f) { }
Khai báo lớp trong
thừa kế bội
Gọi hàm xây dựng
của các lớp cha
Liên kết tĩnh và liên kết động
• Sự tương thích giữa đối tượng của lớp con và đối tượng
của lớp cha
LỚPCHA
LỚPCON
void main() {
LopCha a;
LopCon b;
a = b;
b = a; // Sai
Cĩ thể gán Cha = Con
Hổn
16
class LopCha {
};
class LopCon
: public
LopCha {
};
LopCha *pa;
pa = &a;
LopCon *pb;
pb = &b;
pa = &b;
pb = &a; //
Sai
}
Con trỏ của lớp cha cĩ
thể trỏ đến
đối tượng
của lớp con
• Liên kết tĩnh
– Con trỏ thuộc lớp nào, khi gọi hàm sẽ gọi hàm của lớp đĩ.
– Tính chất của đối tượng được nhận biết khi biên dịch CT.
class LopCha {
public:
void main() {
LopCha a;
LopCha *pa=&a;
Liên kết tĩnh và liên kết động
17
void HamThanhVien() {
cout<<“Ham cua Lop Cha”;}
};
class LopCon:public LopCha {
public:
void HamThanhVien() {
cout<<“Ham cua Lop Con”;}
};
//Lớp cha
pa->HamThanhVien();
LopCon b;
LopCon *pb=&b;
//Lớp con
pb->HamThanhVien();
pa= &b;
//Lớp cha
pa->HamThanhVien();
pb= &a; //Báo lỗi
}
• Hàm ảo
– Cú pháp: khai báo thêm từ khĩa virtual trước hàm.
– Dùng chung với tính liên kết động => tính đa hình
class LopCha class LopCon : public LopCha
{
Liên kết tĩnh và liên kết động
18
{
...
public:
virtual void HamAo()
{ }
};
...
public:
void HamAo()
{ }
};
Hàm hồn tồn ảo
Cú pháp: chỉ khai báo tên trong lớp cha và gán=0.
Hàm hồn tồn ảo phải định nghĩa lại trong lớp con.
class LopCha class LopCon:public LopCha
Liên kết tĩnh và liên kết động
19
{
...
public:
virtual void HamHT_Ao()=0;
};
{
...
public:
void HamHT_Ao() { }
};
• Liên kết động
– Con trỏ đang trỏ đến đối tượng nào, khi gọi hàm ảo sẽ gọi
hàm của lớp tạo ra đối tượng đĩ.
– Tính chất của đối tượng được nhận biết khi đang thực thi.
class LopCha {
public:
void main() {
LopCha a;
Liên kết tĩnh và liên kết động
20
virtual void HamAo() {
cout<<“Ham cua Lop Cha”;
}
};
class LopCon : public LopCha{
public:
void HamAo() {
cout<<“Ham cua Lop Con”;
}
};
LopCha *pa=&a;
pa->HamAo(); //Lớp cha
LopCon b;
LopCon *pb=&b;
pb->HamAo(); //Lớp con
pa= &b;
pa->HamAo(); //Hàm lớp con
pb= &a; //Báo lỗi
}
Các file đính kèm theo tài liệu này:
- chapter8_8902_1993469.pdf