KếKế
thừathừa
GV. GV. NguyễnNguyễn Minh Minh HuyHuy
KếKế
thừathừa
1Phương pháp lập trình hướng đối tượng - Nguyễn Minh Huy
NộiNội dungdung
KháiKhái niệmniệm kếkế thừathừa
TầmTầm vựcvực trongtrong kếkế thừathừa
ĐịnhĐịnh nghĩanghĩa lạilại phươngphương thứcthức
QuanQuan hệhệ ISIS A A vàvà HASHAS A.A.
2Phương pháp lập trình hướng đối tượng - Nguyễn Minh Huy
NộiNội dungdung
KháiKhái niệmniệm kếkế thừathừa
TầmTầm vựcvực trongtrong kếkế thừathừa
ĐịnhĐịnh nghĩanghĩa lạilại phươngphương thứcthức
QuanQuan hệhệ ISIS A A vàvà HASHAS A.A.
3Phương pháp lập trình hướng đối tượng - Nguyễn Minh Huy
KháiKhái niệmniệm kếkế thừathừa
VấnVấn đềđề trùngtrùng lấplấp thôngthông tin:tin:
XétXét nhiềunhiều lớplớp cócó thôngthông tin tin trùngtrùng nhaunhau
CóCó 2 2 dạngdạng::
DạngDạng chiachia sẻsẻ: A ∩ B ≠ Ø.: A ∩ B ≠ Ø.
DạngDạng mởmở rộngrộng: B = A + : B = A + εε
NhượcNhược
điểmđiểm
::
A
x, y, z
a, b, c
B
x, y, z
u, v, w
NhượcNhược
điểmđiểm
::
XâyXây dựngdựng tốntốn kémkém
Dung Dung lượnglượng lưulưu trữtrữ lớnlớn
ThayThay đổiđổi phầnphần chungchung khókhó khănkhăn
4Phương pháp lập trình hướng đối tượng - Nguyễn Minh Huy
A
x, y, z
B
x, y, z
a, b, c
Giải quyết: tái sử dụng!!
KháiKhái niệmniệm kếkế thừathừa
KháiKhái niệmniệm kếkế thừathừa::
ĐịnhĐịnh nghĩanghĩa lớplớp mớimới dựadựa trêntrên nhữngnhững lớplớp đãđã cócó
LớpLớp cơcơ sởsở:: lớplớp dùngdùng đểđể địnhđịnh nghĩanghĩa lớplớp mớimới
LớpLớp kếkế thừathừa:: lớplớp đượcđược địnhđịnh nghĩanghĩa từtừ lớplớp đãđã cócó
LớpLớp kếkế thừathừa thừathừa hưởnghưởng TẤT CẢTẤT CẢ từtừ lớplớp cơcơ sởsở
5Phương pháp lập trình hướng đối tượng - Nguyễn Minh Huy
A
x, y, z
a, b, c
B
x, y, z
u, v, w
B
x, y, z
a, b, c
O
x, y, z
A
x, y, z
KháiKhái niệmniệm kếkế thừathừa
KhaiKhai báobáo trongtrong C++:C++:
class <class <LớpLớp kếkế thừathừa> : <> : <LoạiLoại kếkế thừathừa> <> <LớpLớp cơcơ sởsở>>
LoạiLoại kếkế thừathừa::
public, private, protected.public, private, protected.
VíVí
dụdụ
::
VíVí
dụdụ
::
class class AA : public : public OO
{{
private:private:
// // KhaiKhai báobáo thuộcthuộc tínhtính mớimới củacủa A.A.
public:public:
// // KhaiKhai báobáo phươngphương thứcthức mớimới củacủa A.A.
};};
6Phương pháp lập trình hướng đối tượng - Nguyễn Minh Huy
KháiKhái niệmniệm kếkế thừathừa
VíVí dụdụ::
ThôngThông tin:tin:
HọHọ têntên
MứcMức
lươnglương
Thông tin:Thông tin:
Họ tên.Họ tên.
Mức lương.Mức lương.
7Phương pháp lập trình hướng đối tượng - Nguyễn Minh Huy
MứcMức
lươnglương
SốSố ngàyngày nghỉnghỉ
CôngCông việcviệc::
GiảngGiảng dạydạy
TínhTính lươnglương
Mức lương.Mức lương.
Số ngày nghỉ.Số ngày nghỉ.
Lớp chủ nhiệm.Lớp chủ nhiệm.
Công việc:Công việc:
Giảng dạy.Giảng dạy.
Tính lương.Tính lương.
Sinh hoạt chủ nhiệm.Sinh hoạt chủ nhiệm.
Giáo viênGiáo viên
GVCNGVCN
KháiKhái niệmniệm kếkế thừathừa
VíVí dụdụ::
class class GiaoVienGiaoVien
{{
private:private:
charchar **m_hoTenm_hoTen;;
floatfloat m_mucLuongm_mucLuong;;
intint m_ngayNghim_ngayNghi;;
public:public:
class class GVCNGVCN : public : public GiaoVienGiaoVien
{{
private:private:
charchar **m_lopCNm_lopCN;;
public:public:
GVCN(char *GVCN(char *hoTenhoTen,,
float float
mucLuongmucLuong
,,
Lớp kế thừa Lớp cơ sở
public:public:
GiaoVienGiaoVien(char *(char *hoTenhoTen,,
float float mucLuongmucLuong,,
intint ngayNghingayNghi););
void void giangDaygiangDay();();
float float tinhLuongtinhLuong();();
};};
8Phương pháp lập trình hướng đối tượng - Nguyễn Minh Huy
float float
mucLuongmucLuong
,,
intint ngayNghingayNghi,,
char *char *lopCNlopCN););
void void sinhHoatCNsinhHoatCN();();
};};
GVCN thừa hưởng TẤT CẢ
thuộc tính và phương thức
của GiaoVien
KháiKhái niệmniệm kếkế thừathừa
VíVí dụdụ::
void main()void main()
{{
GiaoVienGiaoVien gv1(“Minh”, 500000, 5);gv1(“Minh”, 500000, 5);
gv1.giangDay();gv1.giangDay();
float luong1 = gv1.tinhLuong();float luong1 = gv1.tinhLuong();
GVCN gv2(“GVCN gv2(“
HanhHanh
”, 700000, 3);”, 700000, 3);
GVCN gv2(“GVCN gv2(“
HanhHanh
”, 700000, 3);”, 700000, 3);
gv2.giangDay();gv2.giangDay();
gv2.sinhHoatCN();gv2.sinhHoatCN();
float luong2 = float luong2 = gv2.tinhLuong();gv2.tinhLuong();
}}
9Phương pháp lập trình hướng đối tượng - Nguyễn Minh Huy
NộiNội dungdung
KháiKhái niệmniệm kếkế thừathừa
TầmTầm vựcvực trongtrong kếkế thừathừa
ĐịnhĐịnh nghĩanghĩa lạilại phươngphương thứcthức
QuanQuan hệhệ ISIS A A vàvà HASHAS A.A.
10Phương pháp lập trình hướng đối tượng - Nguyễn Minh Huy
TầmTầm vựcvực trongtrong kếkế thừathừa
XétXét lớplớp A A kếkế thừathừa lớplớp O:O:
A A kếkế thừathừa toàntoàn bộbộ thuộcthuộc tínhtính vàvà phươngphương thứcthức củacủa O.O.
TầmTầm vựcvực củacủa nhữngnhững thànhthành phầnphần nàynày thếthế nàonào??
Lớp A Lớp B
Do Do loạiloại kếkế thừathừa quyếtquyết địnhđịnh!!!!
11Phương pháp lập trình hướng đối tượng - Nguyễn Minh Huy
private:
m_iX
protected:
m_iY
public:
m_iZ
???:
m_iX
???:
m_iY
???:
m_iZ
Kế thừa
TầmTầm vựcvực trongtrong kếkế thừathừa
BảngBảng tầmtầm vựcvực trongtrong kếkế thừathừa::
TầmTầm vựcvực
Kế thừa Kế thừa
publicpublic
Kế thừa Kế thừa
protectedprotected
Kế thừa Kế thừa
privateprivate
publicpublic publicpublic protectedprotected privateprivate
12Phương pháp lập trình hướng đối tượng - Nguyễn Minh Huy
protectedprotected protectedprotected protectedprotected privateprivate
privateprivate
KhôngKhông thểthể
truytruy xuấtxuất
Không thể Không thể
truy xuấttruy xuất
KhôngKhông thểthể
truytruy xuấtxuất
NộiNội dungdung
KháiKhái niệmniệm kếkế thừathừa
TầmTầm vựcvực trongtrong kếkế thừathừa
ĐịnhĐịnh nghĩanghĩa lạilại phươngphương thứcthức
QuanQuan hệhệ ISIS A A vàvà HASHAS A.A.
13Phương pháp lập trình hướng đối tượng - Nguyễn Minh Huy
ĐịnhĐịnh nghĩanghĩa lạilại phươngphương thứcthức
KếKế thừathừa mộtmột phầnphần::
CóCó thểthể thaythay đổiđổi nhữngnhững phầnphần đãđã kếkế thừathừa????
KhôngKhông kếkế thừathừa ““máymáy mócmóc” ” tấttất cảcả
LớpLớp kếkế thừathừa cócó thểthể thaythay đổiđổi nhữngnhững gìgì đãđã kếkế thừathừa!!!!
ĐịnhĐịnh nghĩanghĩa lạilại phươngphương thứcthức đãđã kếkế thừathừa
14Phương pháp lập trình hướng đối tượng - Nguyễn Minh Huy
Lớp kế thừa thừa hưởng TẤT CẢ thuộc tính và
phương thức của lớp cơ sở
TRỪ những
phương thức được định nghĩa lại!!
ĐịnhĐịnh nghĩanghĩa lạilại phươngphương thứcthức
VíVí dụdụ::
GVCN GVCN kếkế thừathừa từtừ GiaoVienGiaoVien
GVCN GVCN tínhtính lươnglương kháckhác GiaoVienGiaoVien
LươngLương GV = GV = MứcMức lươnglương –– SốSố ngàyngày nghỉnghỉ * 10000.* 10000.
LươngLương GVCN = GVCN = LươngLương GV + GV + PhụPhụ cấpcấp 100000.100000.
ViếtViết
lạilại
phươngphương
thứcthức
tinhLuongtinhLuong
() ()
chocho
lớplớp
GVCN.GVCN.
ViếtViết
lạilại
phươngphương
thứcthức
tinhLuongtinhLuong
() ()
chocho
lớplớp
GVCN.GVCN.
15Phương pháp lập trình hướng đối tượng - Nguyễn Minh Huy
ĐịnhĐịnh nghĩanghĩa lạilại phươngphương thứcthức
VíVí dụdụ::
class class GiaoVienGiaoVien
{{
private:private:
charchar **m_hoTenm_hoTen;;
floatfloat m_mucLuongm_mucLuong;;
intint m_ngayNghim_ngayNghi;;
public:public:
public:public:
GiaoVienGiaoVien(char *(char *hoTenhoTen, float , float mucLuongmucLuong, , intint ngayNghingayNghi););
void void giangDaygiangDay();();
float float tinhLuongtinhLuong()()
{{
return return m_mucLuongm_mucLuong –– m_ngayNghim_ngayNghi * 10000;* 10000;
}}
};};
16Phương pháp lập trình hướng đối tượng - Nguyễn Minh Huy
ĐịnhĐịnh nghĩanghĩa lạilại phươngphương thứcthức
VíVí dụdụ::
class class GVCNGVCN : public : public GiaoVienGiaoVien
{{
private:private:
charchar **m_lopCNm_lopCN;;
public:public:
GVCN(char *GVCN(char *hoTenhoTen,,
float float
mucLuongmucLuong
,,
void void mainmain()()
{{
GiaoVienGiaoVien gv1(“Minh”, 500000, 5gv1(“Minh”, 500000, 5););
gv1.giangDay();gv1.giangDay();
float luong1 float luong1 = gv1.tinhLuong= gv1.tinhLuong();();
GVCN GVCN
gv2(“gv2(“
HanhHanh
”, 700000, 3”, 700000, 3
););
float float
mucLuongmucLuong
,,
intint ngayNghingayNghi,,
char *char *lopCNlopCN););
void void sinhHoatCNsinhHoatCN();();
float float tinhLuongtinhLuong()()
{{
return return GiaoVienGiaoVien::::TinhLuongTinhLuong() + 100000;() + 100000;
}}
};};
17Phương pháp lập trình hướng đối tượng - Nguyễn Minh Huy
GVCN GVCN
gv2(“gv2(“
HanhHanh
”, 700000, 3”, 700000, 3
););
gv2.giangDay();gv2.giangDay();
float luong2 float luong2 = = gv2.tinhLuonggv2.tinhLuong();();
}}
NộiNội dungdung
KháiKhái niệmniệm kếkế thừathừa
TầmTầm vựcvực trongtrong kếkế thừathừa
ĐịnhĐịnh nghĩanghĩa lạilại phươngphương thứcthức
QuanQuan hệhệ ISIS A A vàvà HASHAS A.A.
18Phương pháp lập trình hướng đối tượng - Nguyễn Minh Huy
QuanQuan hệhệ ISIS A A vàvà HASHAS AA
QuanQuan hệhệ ISIS A:A:
LớpLớp A A quanquan hệhệ ISIS A A vớivới lớplớp BB
A A làlà mộtmột trườngtrường hợphợp đặcđặc biệtbiệt củacủa B.B.
A A cùngcùng loạiloại vớivới B.B.
VíVí dụdụ::
GVCN GVCN làlà mộtmột GiaoVienGiaoVien đặcđặc biệtbiệt
HinhVuongHinhVuong làlà mộtmột HinhChuNhatHinhChuNhat đặcđặc biệtbiệt
ConMeoConMeo làlà mộtmột ConVatConVat đặcđặc biệtbiệt
19Phương pháp lập trình hướng đối tượng - Nguyễn Minh Huy
QuanQuan hệhệ ISIS A A vàvà HASHAS AA
QuanQuan hệhệ HASHAS A:A:
LớpLớp A A quanquan hệhệ HASHAS A A vớivới lớplớp BB
A A baobao hàmhàm B.B.
A A chứachứa B.B.
B B làlà mộtmột bộbộ phậnphận củacủa A.A.
VíVí
dụdụ
::
VíVí
dụdụ
::
ChiecXeChiecXe chứachứa BanhXeBanhXe
QuyenSachQuyenSach chứachứa TrangSachTrangSach
20Phương pháp lập trình hướng đối tượng - Nguyễn Minh Huy
QuanQuan hệhệ ISIS A A vàvà HASHAS AA
Dr. Guru Dr. Guru khuyênkhuyên: : luậtluật xâyxây dựngdựng lớplớp
A A cócó quanquan hệhệ ISIS A A vớivới B.B.
Cho A Cho A kếkế thừathừa B.B.
A A cócó quanquan hệhệ HASHAS A A vớivới B.B.
Cho B Cho B làlà mộtmột thuộcthuộc tínhtính củacủa A.A.
VíVí dụdụ::
class class ConMeoConMeo : public : public ConVatConVat { };{ };
class class ChiecXeChiecXe
{{
private:private:
BanhXeBanhXe **m_banhXem_banhXe;;
};};
21Phương pháp lập trình hướng đối tượng - Nguyễn Minh Huy
TómTóm tắttắt
KháiKhái niệmniệm kếkế thừathừa::
ĐịnhĐịnh nghĩanghĩa lớplớp mớimới dựadựa trêntrên nhữngnhững lớplớp đãđã cócó
LớpLớp kếkế thừathừa thừathừa hưởnghưởng TẤT CẢ TẤT CẢ từtừ lớplớp cơcơ sởsở
TầmTầm vựcvực trongtrong kếkế thừathừa::
TầmTầm
vựcvực
thaythay
đổiđổi
tùytùy
theotheo
loạiloại
kếkế
thừathừa
TầmTầm
vựcvực
thaythay
đổiđổi
tùytùy
theotheo
loạiloại
kếkế
thừathừa
ĐịnhĐịnh nghĩanghĩa lạilại phươngphương thứcthức::
““CảiCải biênbiên” ” nhữngnhững phươngphương thứcthức kếkế thừathừa
QuanQuan hệhệ ISIS A A vàvà HASHAS A:A:
ISIS A: A A: A làlà trườngtrường hợphợp đặcđặc biệtbiệt củacủa B.B.
HASHAS A: A A: A baobao hàmhàm B.B.
22Phương pháp lập trình hướng đối tượng - Nguyễn Minh Huy
BàiBài tậptập
BàiBài tậptập 7.17.1::
NhữngNhững cặpcặp đốiđối tượngtượng sausau cócó quanquan hệhệ ISIS A hay HASA hay HAS A?A?
KhaiKhai báobáo lớplớp chocho từngtừng cặpcặp thểthể hiệnhiện quanquan hệhệ giữagiữa chúngchúng
HìnhHình vuôngvuông / / HìnhHình chữchữ nhậtnhật
ĐaĐa giácgiác / / CạnhCạnh
GiámGiám
đốcđốc
/ /
NhânNhân
viênviên
GiámGiám
đốcđốc
/ /
NhânNhân
viênviên
HìnhHình tròntròn / / HìnhHình Ellipse.Ellipse.
MáyMáy bay / bay / ĐộngĐộng cơcơ
CâuCâu / / TừTừ
MỹMỹ phẩmphẩm / / HàngHàng hóahóa
CâyCây lúalúa / / CâyCây lươnglương thựcthực
ThưThư việnviện / / SáchSách
PhimPhim hoạthoạt hìnhhình / / PhimPhim ảnhảnh
23Phương pháp lập trình hướng đối tượng - Nguyễn Minh Huy
BàiBài tậptập
BàiBài tậptập 7.2:7.2:
Cho Cho lớplớp TaiKhoanTaiKhoan nhưnhư sausau::
class class TaiKhoanTaiKhoan
{{
private:private:
floatfloat m_soDum_soDu = 0;= 0;
public:public:
public:public:
float float baoSoDubaoSoDu() { return () { return m_soDum_soDu; }; }
void void napTiennapTien(float (float soTiensoTien) { ) { m_soDum_soDu += += soTiensoTien; }; }
void void rutTienrutTien(float (float soTiensoTien))
{{
if (if (soTiensoTien <= <= m_soDum_soDu))
m_soDum_soDu = = soTiensoTien;;
}}
};};
24Phương pháp lập trình hướng đối tượng - Nguyễn Minh Huy
BàiBài tậptập
BàiBài tậptập 7.2:7.2:
DựaDựa trêntrên lớplớp TaiKhoanTaiKhoan, , xâyxây dựngdựng lớplớp TaiKhoanTietKiemTaiKhoanTietKiem nhưnhư sausau::
CóCó thêmthêm thôngthông tin:tin:
KỳKỳ hạnhạn gửigửi
LãiLãi suấtsuất
SốSố thángtháng đãđã gửigửi
KhiKhi nạpnạp tiềntiền, , sốsố thángtháng đãđã gửigửi đượcđược tínhtính lạilại từtừ đầuđầu
ChỉChỉ đượcđược rútrút tiềntiền khikhi đếnđến kỳkỳ hạnhạn
Cho Cho phépphép tăngtăng sốsố thángtháng đãđã gửigửi
TínhTính sốsố dưdư tạitại thờithời điểmđiểm hiệnhiện tạitại
25Phương pháp lập trình hướng đối tượng - Nguyễn Minh Huy