際際滷

際際滷Share a Scribd company logo
Khoa C担ng Ngh畛 Th担ng Tin - 畉i H畛c C畉n Th董 1
TH畛A K畉TH畛A K畉
CH働NG 9:CH働NG 9:
(INHERITANCE)(INHERITANCE)
B畛 m担n H畛 Th畛ng M叩y T鱈nh v Truy畛n Th担ng
Khoa C担ng Ngh畛 Th担ng Tin v Truy畛n Th担ng
畉i h畛c C畉n Th董
Khoa C担ng Ngh畛 Th担ng Tin - 畉i H畛c C畉n Th董 2
N畛i dungN畛i dung
 Kh叩i ni畛m
 L畛p d畉n xu畉t 董n gi畉n
 K箪 hi畛u c叩c th畛 b畉c
 Hm x但y d畛ng v hm h畛y
 Thnh vi棚n l畛p 動畛c b畉o v畛
 L畛p c董 s畛 ri棚ng, chung v 動畛c b畉o v畛
 a th畛a k畉 - S畛 m董 h畛
 Hm 畉o - L畛p c董 s畛 畉o
 Chuy畛n ki畛u
 C叩c to叩n t畛 動畛c t叩i 畛nh ngh挑a
Ch動董ng 9
Khoa C担ng Ngh畛 Th担ng Tin - 畉i H畛c C畉n Th董 3
Kh叩i ni畛mKh叩i ni畛m
 K畉 th畛a t畛 c叩c l畛p c坦 t畛 tr動畛c.
 ch l畛i: c坦 th畛 t畉n d畛ng l畉i
 C叩c thu畛c t鱈nh chung
 C叩c hm c坦 thao t叩c t動董ng t畛
Ch動董ng 9
L畛P CHAL畛P CHA
(Super class)
L畛P CONL畛P CON
(Sub class)
L畛p c董 s畛
(Base class)
L畛p d畉n xu畉t
(Derived class)
STUDENTSTUDENT
CIT_STUDENTCIT_STUDENT
Khoa C担ng Ngh畛 Th担ng Tin - 畉i H畛c C畉n Th董 4
V鱈 d畛 minh h畛aV鱈 d畛 minh h畛a
Ch動董ng 9
#include <iostream.h>
#include <string.h>
class ContactContact {
private:
char *name; // ten doi tac
char *address; // dia chi doi tac
char *tel; // so dien thoai
public:
Contact (const char *name,
const char *address, const char *tel);
~Contact ();
const char* Name () const { return name;}
const char* Address() const { return address;}
const char* Tel() const { return tel;}
friend ostream& operator <<
( ostream&, Contact& );
};
class ContactDirContactDir {
private:
int Lookup(const char *name);
Contact **contacts; // ds cac doi tac
int dirSize; // kich thuoc thu muc hien tai
int maxSize; // kich thuoc thu muc toi da
public:
ContactDir (const int maxSize);
~ContactDir();
void Insert(const Contact&);
void Delete(const char *name);
Contact* Find(const char *name);
friend ostream& operator <<
(ostream&, ContactDir&);
// 
};
ContactDirContactDir ContactContact
nK箪 hi畛u
composition
Khoa C担ng Ngh畛 Th担ng Tin - 畉i H畛c C畉n Th董 5
V鱈 d畛 minh h畛a (tt)V鱈 d畛 minh h畛a (tt)
Ch動董ng 9
class SmartDirSmartDir : public ContactDir {
private:
char *recent; // ten duoc tim gan nhat
public:
SmartDir(const int max) : ContactDir(max)
{ recent = 0; }
Contact* Recent (void);
Contact* Find (const char *name);
// .
};
Contact* SmartDir::Recent (void) {
return recent == 0 ? 0 :
ContactDir::Find(recent);
}
Contact* SmartDir::Find (const char *name) {
Contact *c = ContactDir::Find(name);
if (c != 0)
recent = (char*) c->Name();
return c;
}
K箪 hi畛u
Th畛a k畉
ContactDirContactDir ContactContact
n
SmartDirSmartDir
Khoa C担ng Ngh畛 Th担ng Tin - 畉i H畛c C畉n Th董 6
V鱈 d畛 (tt) - m担 t畉 trong b畛 nh畛V鱈 d畛 (tt) - m担 t畉 trong b畛 nh畛
Ch動董ng 9
*contacts 1
*contacts 2
*contacts 3
*contacts i
*contacts n


**contacts
dirSize
maxSize
**contacts
dirSize
maxSize
*recent*recent
Contact 1
Contact 2
Contact i

*contacts 1
*contacts 2
*contacts 3
*contacts i
*contacts n


Contact 1
Contact 2
Contact i

ContactDir
SmartDir
Khoa C担ng Ngh畛 Th担ng Tin - 畉i H畛c C畉n Th董 7
Hm x但y d畛ng v hm h畛yHm x但y d畛ng v hm h畛y
 Trong th畛a k畉, khi kh畛i t畉o 畛i t動畛ng:
 Hm x但y d畛ng c畛a l畛p cha s畉 動畛c g畛i tr動畛c
 Sau 坦 m畛i l hm x但y d畛ng c畛a l畛p con.
 Trong th畛a k畉, khi h畛y b畛 畛i t動畛ng:
 Hm h畛y c畛a l畛p con s畉 動畛c g畛i tr動畛c
 Sau 坦 m畛i l hm h畛y c畛a l畛p cha.
Ch動董ng 9
AA
BB
CC
Khoa C担ng Ngh畛 Th担ng Tin - 畉i H畛c C畉n Th董 8
Hm x但y d畛ng v hm h畛y (tt)Hm x但y d畛ng v hm h畛y (tt)
Ch動董ng 9
class SmartDirSmartDir : public ContactDir {
private:
char *recent; // ten duoc tim gan nhat
public:
SmartDir(const int max) : ContactDir(max)
{ recent = 0; }
SmartDir(const SmartDir& sd): ContactDir(sd)
{ recent = 0; }
~SmartDir() {
delete recent;
}
// .
};
G畛i hm
x但y d畛ng
c畛a l畛p cha
Thu h畛i v湛ng nh畛
c畛a con tr畛 thnh vi棚n
c畛a l畛p con n畉u 達
c畉p v湛ng nh畛 trong
hm x但y d畛ng.
Khoa C担ng Ngh畛 Th担ng Tin - 畉i H畛c C畉n Th董 9
Thnh vi棚n l畛p 動畛c b畉o v畛Thnh vi棚n l畛p 動畛c b畉o v畛
 Th畛a k畉:
 C坦 t畉t c畉 c叩c d畛 li畛u v hm thnh vi棚n.
 Kh担ng 動畛c truy xu畉t 畉n thnh vi棚n private.
 Thu畛c t鱈nh truy c畉p protectedprotected:
 Cho ph辿p l畛p con truy xu畉t.
Ch動董ng 9
class ContactDirContactDir {
//...
protected:
int Lookup (const char *name);
Contact **contacts; // ds cac doi tac
int dirSize; // kich thuoc hien tai
int maxSize; // kich thuoc toi da
};
class Foo {
public:
// cac thanh vien chung...
private:
// cac thanh vien rieng...
protected:
// cac thanh vien duoc bao ve...
public:
// cac thanh vien chung nua...
protected:
// cac thanh vien duoc bao ve nua...
};
Khoa C担ng Ngh畛 Th担ng Tin - 畉i H畛c C畉n Th董 10
L畛p c董 s畛 ri棚ng, chung v 動畛c b畉o v畛L畛p c董 s畛 ri棚ng, chung v 動畛c b畉o v畛
Ch動董ng 9
class AA {
private:
int x;
void Fx (void);
public:
int y;
void Fy (void);
protected:
int z;
void Fz (void);
};
class BB : A { // Th畛a k畉 d畉ng private
.
};
class CC : private A { // A l l畛p c董 s畛 ri棚ng c畛a B

};
class DD : public A { // A l l畛p c董 s畛 chung c畛a C

};
class EE : protected A { // A: l畛p c董 s畛 動畛c b畉o v畛
.
};
L畛p c董 s畛 Th畛a k畉 public Th畛a k畉 private Th畛a k畉 protected
privateprivate _ _ _
publicpublic public private protected
protectedprotected protected private protected
Khoa C担ng Ngh畛 Th担ng Tin - 畉i H畛c C畉n Th董 11
a th畛a k畉芯a th畛a k畉
Ch動董ng 9
OptionListOptionList WindowWindow
MenuMenu
class WindowWindow {
public:
Window (Rect &);
~Window (void);
//...
};
class Menu
: public OptionList, public Window {
public:
Menu (int n, Rect &bounds);
~Menu (void);
//...
};
Menu::Menu (int n, Rect &bounds) :
OptionList(n), Window(bounds)
{ /* ... */ }
OptionList object
OptionList
data members
Window object
Window
data members
Menu object
OptionList
data members
Window
data members
Menu
data members
class OptionListOptionList {
public:
OptionList (int n);
~OptionList ();
//...
};
Khoa C担ng Ngh畛 Th担ng Tin - 畉i H畛c C畉n Th董 12
S畛 m董 h畛 trong a th畛a k畉S畛 m董 h畛 trong a th畛a k畉
Ch動董ng 9
class OptionListOptionList {
public:
// 
void Highlight (int part);
};
class WindowWindow {
public:
// 
void Highlight (int part);
};
class Menu : public OptionList,
public Window
{ . };
void main() {
Menu m1(.);
m1.Highlight(10);
.
}
G畛iG畛i
hmhm
c畛a l畛pc畛a l畛p
no ?no ?
void main() {
Menu m1(.);
m1.OptionList::::Highlight(10);
m1.Window::::Highlight(20);
.
}
Ch畛 r探 hmCh畛 r探 hm
c畛a l畛p noc畛a l畛p no
x畛 l箪x畛 l箪
Hm c湛ng t棚nHm c湛ng t棚n
Khoa C担ng Ngh畛 Th担ng Tin - 畉i H畛c C畉n Th董 13
Chuy畛n ki畛uChuy畛n ki畛u
 C坦 s畉n 1 ph辿p chuy畛n ki畛u kh担ng t動畛ng minh:
 畛i t動畛ng l畛p cha = 畛i t動畛ng l畛p con;
 p d畛ng cho c畉 畛i t動畛ng, tham chi畉u v con tr畛.
Ch動董ng 9
 Kh担ng 動畛c th畛c hi畛n ph辿p g叩n ng動畛c:
 畛i t動畛ng l畛p con = 畛i t動畛ng l畛p cha; // SAISAI
Menu m(n, bounds);
Window win = m;
Window &wRef = m;
Window *wPtr = &menu;
class MenuMenu : public OptionList, public Window {
public:
//...
Menu (Window&);
};
N畉u mu畛n th畛c
hi畛n
ph畉i t畛 畛nh ngh挑a
ph辿p 辿p ki畛u
Window
data members
OptionList data members
Window data members
Menu data members
win
m
Khoa C担ng Ngh畛 Th担ng Tin - 畉i H畛c C畉n Th董 14
Hm 畉oHm 畉o
 Li棚n k畉t t挑nh (static binding):
 X叩c 畛nh khi bi棚n d畛ch ch動董ng tr狸nh.
 D湛ng hm thnh vi棚n.
 G畛i hm c畛a l畛p c董 s畛 (l畛p cha).
Ch動董ng 9
class ContactDirContactDir {
//...
public:
int Lookup (const char *name);
//...
};
class SortedDirSortedDir : public ContactDir {
public:
SortedDir(const int max) : ContactDir(max) {}
int Lookup(const char *name);
};
void main() {
ContactDir c1(10);
SortedDir *p; p = &c1;
cout<<p->Lookup(ABC);
.
}
G畛iG畛i
hmhm
no ?no ?
Khoa C担ng Ngh畛 Th担ng Tin - 畉i H畛c C畉n Th董 15
Hm 畉o (tt)Hm 畉o (tt)
 Li棚n k畉t 畛ng (dynamic binding)
 X叩c 畛nh khi th畛c thi ch動董ng tr狸nh.
 D湛ng hm 畉o (virtual function).
 G畛i hm c畛a l畛p d畉n xu畉t (l畛p con).
 Th畛 hi畛n t鱈nh a h狸nh c畛a OOP.
Ch動董ng 9
class ContactDirContactDir {
//...
public:
virtual int Lookup (const char *name);
};
class SortedDirSortedDir : public ContactDir {
//.
public:
int Lookup(const char *name);
};
void main() {
ContactDir c1(10);
SortedDir *p1; p1 = &c1;
cout<<p->Lookup(ABC);
SortedDir c2(20);
ContactDir *p2; p2 = &c2;
cout<<p->Lookup(ABC);
}
G畛i hmG畛i hm
c畛a l畛pc畛a l畛p
no ?no ?
K畉t qu畉K畉t qu畉
tr棚ntr棚n
mn h狸nhmn h狸nh
l g狸?l g狸?
Khoa C担ng Ngh畛 Th担ng Tin - 畉i H畛c C畉n Th董 16
L畛p c董 s畛 畉oL畛p c董 s畛 畉o
Ch動董ng 9
class OptionListOptionList
: public Widget, List
{ /*...*/ };
class WindowWindow
: public Widget, Port
{ /*...*/ };
class MenuMenu
: public OptionList,
public Window
{ /*...*/ };
畛i t動畛ng Menu
 S畛 m董 h畛 - d動 th畛a d畛 li畛u
Khoa C担ng Ngh畛 Th担ng Tin - 畉i H畛c C畉n Th董 17
L畛p c董 s畛 畉o (tt)L畛p c董 s畛 畉o (tt)
 C叩ch x畛 l箪: d湛ng l畛p c董 s畛 畉o.
Ch動董ng 9
class OptionListOptionList
: virtual public Widget,
public List
{ /*...*/ };
class WindowWindow
: virtual public Widget,
public Port
{ /*...*/ };
class MenuMenu
: public OptionList,
public Window
{ /*...*/ };
Menu::Menu (int n, Rect &bounds) :
Widget(bounds), OptionList(n), Window(bounds)
{ //... }
Ch畛 c坦 1
畛i t動畛ng Widget
Khoa C担ng Ngh畛 Th担ng Tin - 畉i H畛c C畉n Th董 18
C叩c to叩n t畛 動畛c t叩i 畛nh ngh挑aC叩c to叩n t畛 動畛c t叩i 畛nh ngh挑a
 T動董ng t畛 nh動 t叩i 畛nh ngh挑a hm thnh vi棚n:
 Che gi畉u i to叩n t畛 c畛a l畛p c董 s畛.
 Hm x但y d畛ng sao ch辿p:
Y::YY (const Y&)(const Y&)
 Ph辿p g叩n:
Y& Y::operator =operator = (const Y&)
 N畉u kh担ng 畛nh ngh挑a, s畉 t畛 畛ng c坦 hm x但y
d畛ng sao ch辿p v ph辿p g叩n do ng担n ng畛 t畉o ra.
=> SAISAI khi c坦 con tr畛 thnh vi棚n.
 C畉n th畉n v畛i to叩n t畛 new v delete.
Ch動董ng 9
Khoa C担ng Ngh畛 Th担ng Tin - 畉i H畛c C畉n Th董 19
B畛 SUNGB畛 SUNG
M畛T S畛 V畉N 畛 KHCM畛T S畛 V畉N 畛 KHC
C畉N T畛 TM HI畛U THMC畉N T畛 TM HI畛U THM
Khoa C担ng Ngh畛 Th担ng Tin - 畉i H畛c C畉n Th董 20
StreamStream
 Nh畉p xu畉t th担ng qua StreamStream (D嘆ng):
 T畛ng quan v畛 Stream.
 畛i t動畛ng nh畉p xu畉t chu畉n.
 File.
 Nh畉p xu畉t v畛i File 畛i t動畛ng.
 T叩i 畛nh ngh挑a to叩n t畛 << v畛i File.
 T叩i 畛nh ngh挑a to叩n t畛 >> v畛i File.
B畛 sung
Khoa C担ng Ngh畛 Th担ng Tin - 畉i H畛c C畉n Th董 21
TemplateTemplate
 Thi畉t k畉 l畛p theo TemplateTemplate (m畉u):
 Th畉 no l Template.
 Hm template.
 L畛p template.
 Gi畛i thi畛u v畛 STL
(Standard Template Library).
B畛 sung
Khoa C担ng Ngh畛 Th担ng Tin - 畉i H畛c C畉n Th董 22
ExceptionException
 ExceptionException (Ngo畉i l畛):
 Ngo畉i l畛 l g狸?
 畛 xu畉t ngo畉i l畛 - N畉m b畉t ngo畉i l畛.
 Ngo畉i l畛 trong C++.
 C炭 ph叩p b畉t ngo畉i l畛 trong C++.
 S畛 d畛ng ngo畉i l畛 v畛i Template.
B畛 sung
Khoa C担ng Ngh畛 Th担ng Tin - 畉i H畛c C畉n Th董 23
ContainerContainer
 ContainerContainer (L畛p v畉t ch畛a):
 Container l g狸?
T畉i sao l畉i c畉n Container.
 Container trong C++.
 M畛t s畛 Container trong 1 phi棚n b畉n c畛a C++.
B畛 sung
Khoa C担ng Ngh畛 Th担ng Tin - 畉i H畛c C畉n Th董 24
K畉t th炭c ch動董ng tr狸nh
CU H畛I?CU H畛I?

More Related Content

Lesson09

  • 1. Khoa C担ng Ngh畛 Th担ng Tin - 畉i H畛c C畉n Th董 1 TH畛A K畉TH畛A K畉 CH働NG 9:CH働NG 9: (INHERITANCE)(INHERITANCE) B畛 m担n H畛 Th畛ng M叩y T鱈nh v Truy畛n Th担ng Khoa C担ng Ngh畛 Th担ng Tin v Truy畛n Th担ng 畉i h畛c C畉n Th董
  • 2. Khoa C担ng Ngh畛 Th担ng Tin - 畉i H畛c C畉n Th董 2 N畛i dungN畛i dung Kh叩i ni畛m L畛p d畉n xu畉t 董n gi畉n K箪 hi畛u c叩c th畛 b畉c Hm x但y d畛ng v hm h畛y Thnh vi棚n l畛p 動畛c b畉o v畛 L畛p c董 s畛 ri棚ng, chung v 動畛c b畉o v畛 a th畛a k畉 - S畛 m董 h畛 Hm 畉o - L畛p c董 s畛 畉o Chuy畛n ki畛u C叩c to叩n t畛 動畛c t叩i 畛nh ngh挑a Ch動董ng 9
  • 3. Khoa C担ng Ngh畛 Th担ng Tin - 畉i H畛c C畉n Th董 3 Kh叩i ni畛mKh叩i ni畛m K畉 th畛a t畛 c叩c l畛p c坦 t畛 tr動畛c. ch l畛i: c坦 th畛 t畉n d畛ng l畉i C叩c thu畛c t鱈nh chung C叩c hm c坦 thao t叩c t動董ng t畛 Ch動董ng 9 L畛P CHAL畛P CHA (Super class) L畛P CONL畛P CON (Sub class) L畛p c董 s畛 (Base class) L畛p d畉n xu畉t (Derived class) STUDENTSTUDENT CIT_STUDENTCIT_STUDENT
  • 4. Khoa C担ng Ngh畛 Th担ng Tin - 畉i H畛c C畉n Th董 4 V鱈 d畛 minh h畛aV鱈 d畛 minh h畛a Ch動董ng 9 #include <iostream.h> #include <string.h> class ContactContact { private: char *name; // ten doi tac char *address; // dia chi doi tac char *tel; // so dien thoai public: Contact (const char *name, const char *address, const char *tel); ~Contact (); const char* Name () const { return name;} const char* Address() const { return address;} const char* Tel() const { return tel;} friend ostream& operator << ( ostream&, Contact& ); }; class ContactDirContactDir { private: int Lookup(const char *name); Contact **contacts; // ds cac doi tac int dirSize; // kich thuoc thu muc hien tai int maxSize; // kich thuoc thu muc toi da public: ContactDir (const int maxSize); ~ContactDir(); void Insert(const Contact&); void Delete(const char *name); Contact* Find(const char *name); friend ostream& operator << (ostream&, ContactDir&); // }; ContactDirContactDir ContactContact nK箪 hi畛u composition
  • 5. Khoa C担ng Ngh畛 Th担ng Tin - 畉i H畛c C畉n Th董 5 V鱈 d畛 minh h畛a (tt)V鱈 d畛 minh h畛a (tt) Ch動董ng 9 class SmartDirSmartDir : public ContactDir { private: char *recent; // ten duoc tim gan nhat public: SmartDir(const int max) : ContactDir(max) { recent = 0; } Contact* Recent (void); Contact* Find (const char *name); // . }; Contact* SmartDir::Recent (void) { return recent == 0 ? 0 : ContactDir::Find(recent); } Contact* SmartDir::Find (const char *name) { Contact *c = ContactDir::Find(name); if (c != 0) recent = (char*) c->Name(); return c; } K箪 hi畛u Th畛a k畉 ContactDirContactDir ContactContact n SmartDirSmartDir
  • 6. Khoa C担ng Ngh畛 Th担ng Tin - 畉i H畛c C畉n Th董 6 V鱈 d畛 (tt) - m担 t畉 trong b畛 nh畛V鱈 d畛 (tt) - m担 t畉 trong b畛 nh畛 Ch動董ng 9 *contacts 1 *contacts 2 *contacts 3 *contacts i *contacts n **contacts dirSize maxSize **contacts dirSize maxSize *recent*recent Contact 1 Contact 2 Contact i *contacts 1 *contacts 2 *contacts 3 *contacts i *contacts n Contact 1 Contact 2 Contact i ContactDir SmartDir
  • 7. Khoa C担ng Ngh畛 Th担ng Tin - 畉i H畛c C畉n Th董 7 Hm x但y d畛ng v hm h畛yHm x但y d畛ng v hm h畛y Trong th畛a k畉, khi kh畛i t畉o 畛i t動畛ng: Hm x但y d畛ng c畛a l畛p cha s畉 動畛c g畛i tr動畛c Sau 坦 m畛i l hm x但y d畛ng c畛a l畛p con. Trong th畛a k畉, khi h畛y b畛 畛i t動畛ng: Hm h畛y c畛a l畛p con s畉 動畛c g畛i tr動畛c Sau 坦 m畛i l hm h畛y c畛a l畛p cha. Ch動董ng 9 AA BB CC
  • 8. Khoa C担ng Ngh畛 Th担ng Tin - 畉i H畛c C畉n Th董 8 Hm x但y d畛ng v hm h畛y (tt)Hm x但y d畛ng v hm h畛y (tt) Ch動董ng 9 class SmartDirSmartDir : public ContactDir { private: char *recent; // ten duoc tim gan nhat public: SmartDir(const int max) : ContactDir(max) { recent = 0; } SmartDir(const SmartDir& sd): ContactDir(sd) { recent = 0; } ~SmartDir() { delete recent; } // . }; G畛i hm x但y d畛ng c畛a l畛p cha Thu h畛i v湛ng nh畛 c畛a con tr畛 thnh vi棚n c畛a l畛p con n畉u 達 c畉p v湛ng nh畛 trong hm x但y d畛ng.
  • 9. Khoa C担ng Ngh畛 Th担ng Tin - 畉i H畛c C畉n Th董 9 Thnh vi棚n l畛p 動畛c b畉o v畛Thnh vi棚n l畛p 動畛c b畉o v畛 Th畛a k畉: C坦 t畉t c畉 c叩c d畛 li畛u v hm thnh vi棚n. Kh担ng 動畛c truy xu畉t 畉n thnh vi棚n private. Thu畛c t鱈nh truy c畉p protectedprotected: Cho ph辿p l畛p con truy xu畉t. Ch動董ng 9 class ContactDirContactDir { //... protected: int Lookup (const char *name); Contact **contacts; // ds cac doi tac int dirSize; // kich thuoc hien tai int maxSize; // kich thuoc toi da }; class Foo { public: // cac thanh vien chung... private: // cac thanh vien rieng... protected: // cac thanh vien duoc bao ve... public: // cac thanh vien chung nua... protected: // cac thanh vien duoc bao ve nua... };
  • 10. Khoa C担ng Ngh畛 Th担ng Tin - 畉i H畛c C畉n Th董 10 L畛p c董 s畛 ri棚ng, chung v 動畛c b畉o v畛L畛p c董 s畛 ri棚ng, chung v 動畛c b畉o v畛 Ch動董ng 9 class AA { private: int x; void Fx (void); public: int y; void Fy (void); protected: int z; void Fz (void); }; class BB : A { // Th畛a k畉 d畉ng private . }; class CC : private A { // A l l畛p c董 s畛 ri棚ng c畛a B }; class DD : public A { // A l l畛p c董 s畛 chung c畛a C }; class EE : protected A { // A: l畛p c董 s畛 動畛c b畉o v畛 . }; L畛p c董 s畛 Th畛a k畉 public Th畛a k畉 private Th畛a k畉 protected privateprivate _ _ _ publicpublic public private protected protectedprotected protected private protected
  • 11. Khoa C担ng Ngh畛 Th担ng Tin - 畉i H畛c C畉n Th董 11 a th畛a k畉芯a th畛a k畉 Ch動董ng 9 OptionListOptionList WindowWindow MenuMenu class WindowWindow { public: Window (Rect &); ~Window (void); //... }; class Menu : public OptionList, public Window { public: Menu (int n, Rect &bounds); ~Menu (void); //... }; Menu::Menu (int n, Rect &bounds) : OptionList(n), Window(bounds) { /* ... */ } OptionList object OptionList data members Window object Window data members Menu object OptionList data members Window data members Menu data members class OptionListOptionList { public: OptionList (int n); ~OptionList (); //... };
  • 12. Khoa C担ng Ngh畛 Th担ng Tin - 畉i H畛c C畉n Th董 12 S畛 m董 h畛 trong a th畛a k畉S畛 m董 h畛 trong a th畛a k畉 Ch動董ng 9 class OptionListOptionList { public: // void Highlight (int part); }; class WindowWindow { public: // void Highlight (int part); }; class Menu : public OptionList, public Window { . }; void main() { Menu m1(.); m1.Highlight(10); . } G畛iG畛i hmhm c畛a l畛pc畛a l畛p no ?no ? void main() { Menu m1(.); m1.OptionList::::Highlight(10); m1.Window::::Highlight(20); . } Ch畛 r探 hmCh畛 r探 hm c畛a l畛p noc畛a l畛p no x畛 l箪x畛 l箪 Hm c湛ng t棚nHm c湛ng t棚n
  • 13. Khoa C担ng Ngh畛 Th担ng Tin - 畉i H畛c C畉n Th董 13 Chuy畛n ki畛uChuy畛n ki畛u C坦 s畉n 1 ph辿p chuy畛n ki畛u kh担ng t動畛ng minh: 畛i t動畛ng l畛p cha = 畛i t動畛ng l畛p con; p d畛ng cho c畉 畛i t動畛ng, tham chi畉u v con tr畛. Ch動董ng 9 Kh担ng 動畛c th畛c hi畛n ph辿p g叩n ng動畛c: 畛i t動畛ng l畛p con = 畛i t動畛ng l畛p cha; // SAISAI Menu m(n, bounds); Window win = m; Window &wRef = m; Window *wPtr = &menu; class MenuMenu : public OptionList, public Window { public: //... Menu (Window&); }; N畉u mu畛n th畛c hi畛n ph畉i t畛 畛nh ngh挑a ph辿p 辿p ki畛u Window data members OptionList data members Window data members Menu data members win m
  • 14. Khoa C担ng Ngh畛 Th担ng Tin - 畉i H畛c C畉n Th董 14 Hm 畉oHm 畉o Li棚n k畉t t挑nh (static binding): X叩c 畛nh khi bi棚n d畛ch ch動董ng tr狸nh. D湛ng hm thnh vi棚n. G畛i hm c畛a l畛p c董 s畛 (l畛p cha). Ch動董ng 9 class ContactDirContactDir { //... public: int Lookup (const char *name); //... }; class SortedDirSortedDir : public ContactDir { public: SortedDir(const int max) : ContactDir(max) {} int Lookup(const char *name); }; void main() { ContactDir c1(10); SortedDir *p; p = &c1; cout<<p->Lookup(ABC); . } G畛iG畛i hmhm no ?no ?
  • 15. Khoa C担ng Ngh畛 Th担ng Tin - 畉i H畛c C畉n Th董 15 Hm 畉o (tt)Hm 畉o (tt) Li棚n k畉t 畛ng (dynamic binding) X叩c 畛nh khi th畛c thi ch動董ng tr狸nh. D湛ng hm 畉o (virtual function). G畛i hm c畛a l畛p d畉n xu畉t (l畛p con). Th畛 hi畛n t鱈nh a h狸nh c畛a OOP. Ch動董ng 9 class ContactDirContactDir { //... public: virtual int Lookup (const char *name); }; class SortedDirSortedDir : public ContactDir { //. public: int Lookup(const char *name); }; void main() { ContactDir c1(10); SortedDir *p1; p1 = &c1; cout<<p->Lookup(ABC); SortedDir c2(20); ContactDir *p2; p2 = &c2; cout<<p->Lookup(ABC); } G畛i hmG畛i hm c畛a l畛pc畛a l畛p no ?no ? K畉t qu畉K畉t qu畉 tr棚ntr棚n mn h狸nhmn h狸nh l g狸?l g狸?
  • 16. Khoa C担ng Ngh畛 Th担ng Tin - 畉i H畛c C畉n Th董 16 L畛p c董 s畛 畉oL畛p c董 s畛 畉o Ch動董ng 9 class OptionListOptionList : public Widget, List { /*...*/ }; class WindowWindow : public Widget, Port { /*...*/ }; class MenuMenu : public OptionList, public Window { /*...*/ }; 畛i t動畛ng Menu S畛 m董 h畛 - d動 th畛a d畛 li畛u
  • 17. Khoa C担ng Ngh畛 Th担ng Tin - 畉i H畛c C畉n Th董 17 L畛p c董 s畛 畉o (tt)L畛p c董 s畛 畉o (tt) C叩ch x畛 l箪: d湛ng l畛p c董 s畛 畉o. Ch動董ng 9 class OptionListOptionList : virtual public Widget, public List { /*...*/ }; class WindowWindow : virtual public Widget, public Port { /*...*/ }; class MenuMenu : public OptionList, public Window { /*...*/ }; Menu::Menu (int n, Rect &bounds) : Widget(bounds), OptionList(n), Window(bounds) { //... } Ch畛 c坦 1 畛i t動畛ng Widget
  • 18. Khoa C担ng Ngh畛 Th担ng Tin - 畉i H畛c C畉n Th董 18 C叩c to叩n t畛 動畛c t叩i 畛nh ngh挑aC叩c to叩n t畛 動畛c t叩i 畛nh ngh挑a T動董ng t畛 nh動 t叩i 畛nh ngh挑a hm thnh vi棚n: Che gi畉u i to叩n t畛 c畛a l畛p c董 s畛. Hm x但y d畛ng sao ch辿p: Y::YY (const Y&)(const Y&) Ph辿p g叩n: Y& Y::operator =operator = (const Y&) N畉u kh担ng 畛nh ngh挑a, s畉 t畛 畛ng c坦 hm x但y d畛ng sao ch辿p v ph辿p g叩n do ng担n ng畛 t畉o ra. => SAISAI khi c坦 con tr畛 thnh vi棚n. C畉n th畉n v畛i to叩n t畛 new v delete. Ch動董ng 9
  • 19. Khoa C担ng Ngh畛 Th担ng Tin - 畉i H畛c C畉n Th董 19 B畛 SUNGB畛 SUNG M畛T S畛 V畉N 畛 KHCM畛T S畛 V畉N 畛 KHC C畉N T畛 TM HI畛U THMC畉N T畛 TM HI畛U THM
  • 20. Khoa C担ng Ngh畛 Th担ng Tin - 畉i H畛c C畉n Th董 20 StreamStream Nh畉p xu畉t th担ng qua StreamStream (D嘆ng): T畛ng quan v畛 Stream. 畛i t動畛ng nh畉p xu畉t chu畉n. File. Nh畉p xu畉t v畛i File 畛i t動畛ng. T叩i 畛nh ngh挑a to叩n t畛 << v畛i File. T叩i 畛nh ngh挑a to叩n t畛 >> v畛i File. B畛 sung
  • 21. Khoa C担ng Ngh畛 Th担ng Tin - 畉i H畛c C畉n Th董 21 TemplateTemplate Thi畉t k畉 l畛p theo TemplateTemplate (m畉u): Th畉 no l Template. Hm template. L畛p template. Gi畛i thi畛u v畛 STL (Standard Template Library). B畛 sung
  • 22. Khoa C担ng Ngh畛 Th担ng Tin - 畉i H畛c C畉n Th董 22 ExceptionException ExceptionException (Ngo畉i l畛): Ngo畉i l畛 l g狸? 畛 xu畉t ngo畉i l畛 - N畉m b畉t ngo畉i l畛. Ngo畉i l畛 trong C++. C炭 ph叩p b畉t ngo畉i l畛 trong C++. S畛 d畛ng ngo畉i l畛 v畛i Template. B畛 sung
  • 23. Khoa C担ng Ngh畛 Th担ng Tin - 畉i H畛c C畉n Th董 23 ContainerContainer ContainerContainer (L畛p v畉t ch畛a): Container l g狸? T畉i sao l畉i c畉n Container. Container trong C++. M畛t s畛 Container trong 1 phi棚n b畉n c畛a C++. B畛 sung
  • 24. Khoa C担ng Ngh畛 Th担ng Tin - 畉i H畛c C畉n Th董 24 K畉t th炭c ch動董ng tr狸nh CU H畛I?CU H畛I?