Chuong 06 - Ke Thua
-
Upload
nguyenlegiaphung -
Category
Documents
-
view
8 -
download
0
Transcript of Chuong 06 - Ke Thua
-
CHNG 6. K THA
ThS. Trn Anh Dng
-
Ni dung
14/09/2014 Lp trnh hng i tng 2
Quan h gia cc lp i tng 1
K tha 2
K tha n 3
Phm vi truy xut trong k tha 4
a k tha 5 5
-
Quan h gia cc lp i tng
Gia cc lp i tng c nhng loi quan
h sau:
Quan h mt mt (1-1)
Quan h mt nhiu (1-n)
Quan h nhiu nhiu (n-n)
Quan h c bit ha, tng qut ha
14/09/2014 Lp trnh hng i tng 3
-
Quan h mt mt (1-1)
Khi nim: Hai lp i tng c gi l
c quan h mt-mt vi nhau khi mt i
tng thuc lp ny quan h vi mt i
tng thuc lp kia v mt i tng thuc
lp kia c quan h duy nht vi mt i
tng thuc lp ny.
K hiu:
14/09/2014 Lp trnh hng i tng 4
ClassA ClassB Quan h
-
Quan h mt mt (1-1)
V d:
14/09/2014 Lp trnh hng i tng 5
LOPHOC GIAOVIEN Ch nhim
VO CHONG Hn nhn
COUNTRY CAPITAL C
-
Quan h mt nhiu (1-n)
Khi nim: Hai lp i tng c gi l
c quan h mt-nhiu vi nhau khi mt i
tng thuc lp ny quan h vi nhiu i
tng thuc lp kia v mt i tng lp
kia c quan h duy nht vi mt i tng
thuc lp ny.
K hiu:
14/09/2014 Lp trnh hng i tng 6
ClassA ClassB Quan h
-
Quan h mt nhiu (1-n)
V d:
14/09/2014 Lp trnh hng i tng 7
LOPHOC HOCSINH C
CONGTY NHANVIEN C
HOASI TACPHAM Sng tc
-
Quan h nhiu nhiu (n-n)
Khi nim: hai lp i tng c gi l
quan h nhiu-nhiu vi nhau khi mt i
tng thuc lp ny c quan h vi nhiu
i tng thuc lp kia v mt i tng
lp kia cng c quan h vi nhiu i
tng thuc lp ny.
K hiu
14/09/2014 Lp trnh hng i tng 8
ClassA ClassB Quan h
-
Quan h nhiu nhiu (n-n)
V d
14/09/2014 Lp trnh hng i tng 9
NAM NU Yu
BACSI BENHNHAN Khm bnh
-
Quan h c bit ha tng qut ha
Khi nim: hai lp i tng c gi l
c quan h c bit ha-tng qut ha vi
nhau khi lp i tng ny l trng hp
c bit ca lp i tng kia v lp i
tng kia l trng hp tng qut ca lp
i tng ny.
K kiu:
14/09/2014 Lp trnh hng i tng 10
ClassA
ClassB
-
Quan h c bit ha tng qut ha
V d:
14/09/2014 Lp trnh hng i tng 11
TAMGIAC
TAMGIACCAN
NGUOI
SINHVIEN
-
Quan h c bit ha tng qut ha
14/09/2014 Lp trnh hng i tng 12
Triangle
Polygon
Animal
Cat Horse Chicken
TerrestrialAnimal AquaticAnimal
Fish Octopus
Rectangle
-
K tha
K tha l mt c im ca ngn ng dng
biu din mi quan h c bit ha tng qut
ha gia cc lp. Cc lp c tru tng ha
v c t chc thnh mt s phn cp lp.
S k tha l mt mc cao hn ca tru tng
ha, cung cp mt c ch gom chung cc lp c
lin quan vi nhau thnh mt mc khi qut ha
c trng cho ton b cc lp ni trn.
14/09/2014 Lp trnh hng i tng 13
-
K tha
Cc lp vi cc c im tng t nhau c th
c t chc thnh mt s phn cp k tha
(cy k tha).
Quan h l 1: K tha c s dng thng
dng nht biu din quan h l 1.
Mt sinh vin l mt ngi
Mt hnh trn l mt hnh ellipse
Mt tam gic l mt a gic
14/09/2014 Lp trnh hng i tng 14
-
Li ch k tha
K tha cho php xy dng lp mi t lp c.
K tha cho php t chc cc lp chia s m
chng trnh chung, nh vy c th d dng sa
cha, nng cp h thng.
Trong C++, k tha cn nh ngha s tng
thch, nh ta c c ch chuyn kiu t ng.
14/09/2014 Lp trnh hng i tng 15
-
c tnh K tha
14/09/2014 Lp trnh hng i tng 16
Cho php nh ngha lp mi t lp c.
Lp mi gi l lp con (subclass) hay lp dn xut
(derived class)
Lp c gi l lp cha (superclass) hay lp c s
(base class).
-
c tnh K tha
Tha k cho php:
Nhiu lp c th dn xut t mt lp c s
Mt lp c th l dn xut ca nhiu lp c s
Tha k khng ch gii hn mt mc: Mt lp
dn xut c th l lp c s cho cc lp dn xut
khc
14/09/2014 Lp trnh hng i tng 17
Animal
Cat Horse Chicken
TerrestrialAnimal AquaticAnimal
Fish Octopus
-
C php khai bo k tha
class SuperClass{
//Thnh phn ca lp c s
};
class DerivedClass : public/protected/private
SusperClass{
//Thnh phn b sung ca lp dn xut
};
14/09/2014 Lp trnh hng i tng 18
-
Truy cp thnh vin ca lp
14/09/2014 Lp trnh hng i tng 19
-
K tha n
Xt hai khi nim Ngi v Sinh vin vi mi
quan h t nhin: Mt Sinh vin l mt Ngi.
Trong C++, ta c th biu din khi nim trn,
mt sinh vin l mt ngi c thm mt s thng
tin v mt s thao tc (ring bit ca sinh vin).
Nh vy, ta t chc lp Sinh vin k tha t lp
Ngi.
14/09/2014 Lp trnh hng i tng 20
-
K tha n
Ta c th t chc hai lp Nam sinh v N sinh l
hai lp con (lp dn xut) ca lp Sinh vin.
Trng hp ny, lp Sinh vin tr thnh lp cha
(lp c s) ca hai lp trn.
14/09/2014 Lp trnh hng i tng 21
NGI
GING VIN SINH VIN
NAM SINH N SINH
-
K tha n V d
14/09/2014 Lp trnh hng i tng 22
class Nguoi {
char *HoTen;
int NamSinh;
public:
Nguoi();
Nguoi( char *ht, int ns):NamSinh(ns) {HoTen=strdup(ht);}
~Nguoi() {delete [ ] HoTen;}
void An() const { cout
-
K tha n V d
14/09/2014 Lp trnh hng i tng 23
class SinhVien : public Nguoi {
char *MaSo;
public:
SinhVien();
SinhVien( char *ht, char *ms, int ns) : Nguoi(ht,ns) {
MaSo = strdup(ms);
}
~SinhVien() {
delete [ ] MaSo;
}
void Xuat() const;
};
-
K tha n V d
14/09/2014 Lp trnh hng i tng 24
void Nguoi::Xuat() const
{
cout
-
K tha n V d
14/09/2014 Lp trnh hng i tng 25
void main() {
Nguoi p1("Le Van Nhan",1980);
SinhVien s1("Vo Vien Sinh", "200002541",1984);
cout
-
K tha c tnh ca lp cha
Khai bo
class SinhVien : public Nguoi {
//...
};
Cho bit lp Sinh vin k tha t lp Ngi. Khi
Sinh vin tha hng cc c tnh ca lp Ngi.
V mt d liu: Mi i tng Sinh vin t ng
c thnh phn d liu h tn, nm sinh ca
ngi.
14/09/2014 Lp trnh hng i tng 26
-
K tha c tnh ca lp cha
V mt thao tc: Lp Sinh vin c t ng k
tha cc thao tc ca lp cha. y chnh l kh
nng s dng li m chng trnh.
Ring phng thc thit lp khng c k
tha.
Kh nng tha hng cc thao tc ca lp c s
c th c truyn qua v hn mc.
14/09/2014 Lp trnh hng i tng 27
-
nh ngha li thao tc lp con
Ta c th nh ngha li cc c tnh lp con
c lp cha, vic nh ngha ch yu l thao tc.
14/09/2014 Lp trnh hng i tng 28
class SinhVien : public Nguoi {
char *MaSo;
public:
//...
void Xuat() const;
};
void SinhVien::Xuat() const {
cout
-
Rng buc ng ngha lp con
C th p dng quan h k tha mang ngha
rng buc, i tng lp con l i tng
lp cha nhng c d liu b rng buc:
Hnh trn l Ellipse vi rng buc bn knh ngang dc
bng nhau.
S o l s phc vi rng buc phn o bng 0
Lp s o sau y l mt v d minh ha.
14/09/2014 Lp trnh hng i tng 29
-
V d
14/09/2014 Lp trnh hng i tng 30
class Complex {
friend ostream& operator
-
V d
14/09/2014 Lp trnh hng i tng 31
class Imag: public Complex {
public:
Imag(double i = 0):Complex(0, i){ }
Imag(const Complex &c) : Complex(0, c.im){ }
Imag& operator = (const Complex &c){
re = 0; im = c.im;
return *this;
}
double Norm() const {
return fabs(im);
}
};
-
V d
14/09/2014 Lp trnh hng i tng 32
void main()
{
Imag i = 1;
Complex z1(1,1)
Complex z3 = z1 - i; // z3 = (1,0)
i = Complex(5,2); // i la so ao (0,2)
Imag j = z1; // j la so ao (0,1)
cout
-
Rng buc ng ngha lp con
Trong v d trn, lp s o (Imag) k tha hu
ht cc thao tc ca lp s phc (Complex).
Tuy nhin, ta mun rng buc mi i tng
thuc lp s o u phi c phn thc bng 0. V
vy, phi nh ngha li cc hm thnh phn c
th vi phm iu ny.
V d php ton gn phi c nh ngha li
m bo rng buc ny.
14/09/2014 Lp trnh hng i tng 33
-
Phm vi truy xut
Khi thit lp quan h k tha, ta vn phi
quan tm n tnh ng gi v che du
thng tin.
iu ny nh hng n phm vi truy xut
ca cc thnh phn ca lp.
Hai vn c t ra l:
Truy xut theo chiu dc Truy xut theo chiu ngang
14/09/2014 Lp trnh hng i tng 34
-
Phm vi truy xut
Truy xut theo chiu dc:
Hm thnh phn ca lp con c quyn truy
xut cc thnh phn ca lp cha hay khng?
Truy xut theo chiu ngang:
Cc thnh phn ca lp cha, sau khi k tha
xung lp con, th th gii bn ngoi c quyn
truy xut thng qua i tng ca lp con hay
khng?
14/09/2014 Lp trnh hng i tng 35
-
Truy xut theo chiu dc
Lp con c quyn truy xut cc thnh phn
ca lp cha hay khng, hon ton do lp
cha quyt nh. iu c xc nh
bng thuc tnh k tha.
Trong trng hp lp Sinh vin k tha lp
Ngi, Sinh vin c quyn truy xut h tn ca
chnh mnh (c khai bo lp Ngi) hay
khng?
14/09/2014 Lp trnh hng i tng 36
-
Phm vi truy xut
14/09/2014 Lp trnh hng i tng 37
class A{
private:
int a;
void f();
protected:
int b;
void g();
public:
int c;
void h();
};
void A::f()
{
a = 1; b = 2; c = 3;
}
void A::g()
{
a = 4; b = 5; c = 6;
}
void A::h(){
a = 7; b = 8; c = 9;
}
-
Phm vi truy xut
14/09/2014 Lp trnh hng i tng 38
void main()
{
A x;
x.a = 10;
x.f();
V d: Cho bit trong on chng trnh
sau cu lnh no ng, cu lnh no sai.
x.b = 20;
x.g();
x.c = 30;
x.h();
}
-
Phm vi truy xut
Thuc tnh public:
Thnh phn no c thuc tnh public th c th truy
xut t bt c ni no.
Thuc tnh private: Thnh phn c thuc tnh
private
L ring t ca lp
Ch c hm thnh phn ca lp v ngoi l cc hm
bn c php truy xut.
Cc lp con cng khng c quyn truy xut
14/09/2014 Lp trnh hng i tng 39
-
Phm vi truy xut
Thuc tnh protected:
Cho php qui nh mt vi thnh phn no ca lp
l bo mt, theo ngha th gii bn ngoi khng c
php truy xut, nhng tt c cc lp con, chu u
c php truy xut.
14/09/2014 Lp trnh hng i tng 40
-
V d Thuc tnh private
14/09/2014 Lp trnh hng i tng 41
class Nguoi {
char *HoTen;
int NamSinh;
public:
//...
};
class SinhVien : public Nguoi {
char *MaSo;
public:
//...
void Xuat() const;
};
-
Thuc tnh private
Trong v d trn, khng c hm thnh phn no
ca lp SinhVien c th truy xut cc thnh phn
HoTen, NamSinh ca lp Nguoi.
V d, on chng trnh sau y s gy ra li:
void SinhVien::Xuat() const {
cout
-
Thuc tnh private
Ta c th khc phc li trn nh khai bo lp
SinhVien l bn ca lp Nguoi nh trong v d
ban u:
14/09/2014 Lp trnh hng i tng 43
class Nguoi {
friend class SinhVien;
char *HoTen;
int NamSinh;
public:
//...
};
-
Thuc tnh private
Khai bo lp bn nh trn, lp SinhVien c th
truy xut cc thnh phn private ca lp Nguoi.
Cch lm trn ch gii quyt c nhu cu ca
ngi s dng khi mun to lp con c quyn
truy xut cc thnh phn d liu private ca lp
cha.
Tuy nhin, cn phi sa li lp cha v tt c cc
lp cp cao hn mi khi c mt lp con mi.
14/09/2014 Lp trnh hng i tng 44
-
Thuc tnh private
14/09/2014 Lp trnh hng i tng 45
class Nguoi {
friend class SinhVien;
friend class NuSinh;
char *HoTen; int NamSinh;
public:
//...
void An() const { cout
-
Thuc tnh protected
Trong v d trc, khi ci t lp NuSinh ta phi
thay i lp cha SinhVien v c lp c s Nguoi
mc cao hn.
14/09/2014 Lp trnh hng i tng 46
class Nguoi {
protected:
char *HoTen;
int NamSinh;
public:
//...
};
-
Thuc tnh protected
14/09/2014 Lp trnh hng i tng 47
class SinhVien : public Nguoi {
protected:
char *MaSo;
public:
SinhVien(char *ht, char *ms, int ns) : Nguoi(ht,ns){
MaSo = strdup(ms);
}
~SinhVien(){
delete [ ] MaSo;
}
void Xuat() const;
};
-
Thuc tnh protected
14/09/2014 Lp trnh hng i tng 48
class NuSinh : public SinhVien {
public:
NuSinh(char *ht, char *ms, int ns) : SinhVien(ht,ms,ns){
}
void An() const {
cout
-
Thuc tnh protected
14/09/2014 Lp trnh hng i tng 49
void Nguoi::Xuat() const {
cout
-
Thuc tnh protected
L cch trnh phi sa i lp c s khi c
lp con mi hnh thnh m bo tnh ng gi.
Thng thng ta dng thuc tnh protected cho
thnh phn d liu v public cho thnh phn
phng thc.
Tm ti, thnh phn c thuc tnh protected ch
cho php nhng lp con k tha c php s
dng.
14/09/2014 Lp trnh hng i tng 50
-
Truy xut theo chiu ngang
Thnh phn protected v public ca lp khi k
tha xung lp con th th gii bn ngoi c
quyn truy xut thng qua i tng thuc lp
con hay khng?
iu ny hon ton do lp con quyt nh
bng phm vi k tha: K tha public, K tha
protected, K tha private
14/09/2014 Lp trnh hng i tng 51
-
Phm vi truy xut trong k tha
14/09/2014 Lp trnh hng i tng 52
private
private private private
protected
protected protected protected
public
public public public
D1: public B D3: protected B
D2: private B
-
Phm vi truy xut trong k tha
14/09/2014 Lp trnh hng i tng 53
private Protected public
private ? ? ?
protected ? ? ?
public ? ? ?
Type of Inheritance
Acce
ss C
on
trol fo
r Mem
bers
-
Phm vi truy xut trong k tha
14/09/2014 Lp trnh hng i tng 54
Type of inheritance Base class member access specifier
public
inheritance protected
inheritance private
inheritance
Public
public in derived class.
Can be accessed directly by any
non-static member functions,
friend functions and non-
member functions.
protected in derived class.
Can be accessed directly by all
non-static member functions
and friend functions.
private in derived class.
Can be accessed directly by all
non-static member functions
and friend functions.
Protected
protected in derived class.
Can be accessed directly by all
non-static member functions
and friend functions.
protected in derived class.
Can be accessed directly by all
non-static member functions
and friend functions.
private in derived class.
Can be accessed directly by all
non-static member functions
and friend functions.
Private
Hidden in derived class.
Can be accessed by non-static
member functions and friend
functions through public or
protected member functions
of the base class.
Hidden in derived class.
Can be accessed by non-static
member functions and friend
functions through public or
protected member functions
of the base class.
Hidden in derived class.
Can be accessed by non-static
member functions and friend
functions through public or
protected member functions
of the base class.
-
V d 1
14/09/2014 Lp trnh hng i tng 55
mother
daughter son
class mother{
protected:
int x, y;
public:
void set(int a, int b);
private:
int z;
};
class daughter : public mother{
private:
double a;
public:
void foo ( );
};
void daughter :: foo ( ){
x = y = 20;
set(5, 10);
cout
-
V d 2
14/09/2014 Lp trnh hng i tng 56
mother
daughter son
class mother{
protected:
int x, y;
public:
void set(int a, int b);
private:
int z;
};
class son : private mother{
private:
double b;
public:
void foo ( );
};
void son :: foo ( ){
x = y = 20;
set(5, 10);
cout
-
Phng thc thit lp
Phng thc thit lp ca lp c s lun lun
c gi mi khi c mt i tng ca lp dn
xut c to ra.
Nu mi phng thc thit lp ca lp c s u
i hi phi cung cp tham s th lp con bt
buc phi c phng thc thit lp cung cp
cc tham s
14/09/2014 Lp trnh hng i tng 57
-
Phng thc thit lp
V d 1:
14/09/2014 Lp trnh hng i tng 58
class A {
public:
A ( )
{ cout
-
Phng thc thit lp
V d 2:
14/09/2014 Lp trnh hng i tng 59
class A {
public:
A ( )
{ cout
-
nh ngha cc thnh phn ring
Ngoi cc thnh phn c k tha, lp dn
xut c th nh ngha thm cc thnh phn ring
14/09/2014 Lp trnh hng i tng 60
class HinhTron : Diem {
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;
};
HinhTron t(200,200,50);
-
nh ngha cc thnh phn ring
Lp dn xut cng c th override cc phng
thc c nh ngha trong lp cha.
14/09/2014 Lp trnh hng i tng 61
class A {
protected:
int x, y;
public:
void print (){
cout
-
Truy cp phng thc
14/09/2014 Lp trnh hng i tng 62
class Point{
protected:
int x, y;
public:
void set(int a, int b)
{ x=a; y=b; }
void foo ();
void print();
};
class Circle : public Point{
private: double r;
public:
void set (int a, int b, double c) {
Point ::set(a, b); //same name function call
r = c;
}
void print() { //.. }
};
Circle C;
C.set(10,10,100); ???
C.foo (); ???
C.print(); ???
Point A;
A.set(30,50); ???
A.print();
-
Phng thc hy b
Khi mt i tng b hy i, phng thc hy b
ca n s c gi. Sau , cc phng thc
hy b ca lp c s s c gi mt cch t
ng.
V vy, lp con khng cn v cng khng c
thc hin cc thao tc dn dp cho cc thnh
phn thuc lp cha.
14/09/2014 Lp trnh hng i tng 63
-
Phng thc hy b - V d
14/09/2014 Lp trnh hng i tng 64
class SinhVien : public Nguoi {
char *MaSo;
public:
SinhVien( char *ht, char *ms, int ns) : Nguoi(ht,ns){ MaSo = strdup(ms);
}
SinhVien(const SinhVien &s) : Nguoi(s){
MaSo = strdup(s.MaSo);
}
~SinhVien() {delete [ ] MaSo;}
//...
};
-
Con tr v k tha
Con tr trong k tha hot ng theo nguyn tc
sau:
Con tr tr n i tng thuc lp c s th c th tr
n cc i tng thuc lp con.
Nhng con tr tr n i tng thuc lp con th
khng th tr n cc i tng thuc lp c s.
C th p kiu con tr tr n i tng thuc lp
con c th tr n i tng thuc lp c s. Tuy
nhin thao tc ny c th nguy him.
14/09/2014 Lp trnh hng i tng 65
-
a k tha
a k tha cho php mt lp c th l dn xut
ca nhiu lp c s.
class A : public B, public C {
};
Cc c im ca k tha n vn ng cho
trng hp a k tha.
14/09/2014 Lp trnh hng i tng 66
-
a k tha
Lm th no biu th tnh c lp ca cc thnh
phn cng tn bn trong mt lp dn xut?
Cc phng thc thit lp v hy b c gi
nh th no: th t, truyn thng tin, ?
Lm th no gii quyt tnh trng tha k xung
t trong , lp D dn xut t B v C, v c hai
cng l dn xut ca A
14/09/2014 Lp trnh hng i tng 67
-
a k tha V d
14/09/2014 Lp trnh hng i tng 68
class BASE_A{
public:
int a;
int f( ){
return 0;
}
int g( ){
return 0;
}
int h( ) { return 0;}
};
class BASE_B
{
public:
int a;
int f( ){
return 0;
}
int g( ){
return 0;
}
};
-
a k tha V d
14/09/2014 Lp trnh hng i tng 69
class ClassC : public BASE_A, public BASE_B{
//
};
void main(){
ClassC C;
C.f = g; //Li m h
C.a = 1; //Li m h
C.g(); //Li m h
C.h();
}
-
Q & A