Bài giảng môn Lập trình hướng đối tượng - Chương 8: Thừa kế
• 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 Liên kết tĩnh và liên kết ñộng
Bạn đang xem nội dung tài liệu Bài giảng môn Lập trình hướng đối tượng - 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 hoàn toàn ảo
Cú pháp: chỉ khai báo tên trong lớp cha và gán=0.
Hàm hoàn toà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:
- tran_quang_hai_bangchapter8_3748.pdf