bai giang 12
DESCRIPTION
TRANSCRIPT
![Page 1: Bai Giang 12](https://reader036.vdocuments.pub/reader036/viewer/2022081805/547ca573b379596f2b8b501d/html5/thumbnails/1.jpg)
1
NNộộii dungdungKhái niệmLớp dẫn xuất đơn giảnKý hiệu các thứ bậcHàm xây dựng và hàm hủyThành 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ồHàm ảo - Lớp cơ sở ảoChuyển kiểuCác toán tử được tái định nghĩa
![Page 2: Bai Giang 12](https://reader036.vdocuments.pub/reader036/viewer/2022081805/547ca573b379596f2b8b501d/html5/thumbnails/2.jpg)
2
KhKhááii niniệệmmKế 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 chungCác hàm có thao tác tương tự
LLỚỚP CHAP CHA(Super class)
LLỚỚP CONP CON(Sub class)
Lớp cơ sở(Base class)
Lớp dẫn xuất(Derived class)
STUDENTSTUDENT
CIT_STUDENTCIT_STUDENT
![Page 3: Bai Giang 12](https://reader036.vdocuments.pub/reader036/viewer/2022081805/547ca573b379596f2b8b501d/html5/thumbnails/3.jpg)
3
VVíí ddụụ minhminh hhọọaa
#include <iostream.h>#include <string.h>class ContactContact {
private:char *name; // ten doi tacchar *address; // dia chi doi tacchar *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 tacint dirSize; // kich thuoc thu muc hien taiint 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 ContactContactnKý hiệu
composition
![Page 4: Bai Giang 12](https://reader036.vdocuments.pub/reader036/viewer/2022081805/547ca573b379596f2b8b501d/html5/thumbnails/4.jpg)
4
VVíí ddụụ minhminh hhọọaa ((tttt))
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ệuThừa kế
ContactDirContactDir ContactContactn
SmartDirSmartDir
![Page 5: Bai Giang 12](https://reader036.vdocuments.pub/reader036/viewer/2022081805/547ca573b379596f2b8b501d/html5/thumbnails/5.jpg)
5
VVíí ddụụ ((tttt) ) -- mômô ttảả trongtrong bbộộ nhnhớớ
*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
…
ContactDirSmartDir
![Page 6: Bai Giang 12](https://reader036.vdocuments.pub/reader036/viewer/2022081805/547ca573b379596f2b8b501d/html5/thumbnails/6.jpg)
6
HHààmm xâyxây ddựựngng vvàà hhààmm hhủủyyTrong thừa kế, khi khởi tạo đối tượng:
Hàm xây dựng của lớp cha sẽ được gọi trướcSau đó mới là hàm xây dựng của lớp con.
Trong thừa kế, khi hủy bỏ đối tượng:Hàm hủy của lớp con sẽ được gọi trướcSau đó mới là hàm hủy của lớp cha.
AA
BB
CC
![Page 7: Bai Giang 12](https://reader036.vdocuments.pub/reader036/viewer/2022081805/547ca573b379596f2b8b501d/html5/thumbnails/7.jpg)
7
HHààmm xâyxây ddựựngng vvàà hhààmm hhủủyy ((tttt))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 hàmxây dựng
của lớp cha
Thu hồi vùng nhớcủa con trỏ thành viên
của lớp con nếu đãcấp vùng nhớ trong
hàm xây dựng.
![Page 8: Bai Giang 12](https://reader036.vdocuments.pub/reader036/viewer/2022081805/547ca573b379596f2b8b501d/html5/thumbnails/8.jpg)
8
ThThàànhnh viênviên llớớpp đưđượợcc bbảảoo vvệệThừa kế:
Có tất cả các dữ liệu và hàm thành viên.Không được truy xuất đến thành viên private.
Thuộc tính truy cập protectedprotected:Cho phép lớp con truy xuất.
class ContactDirContactDir {//...
protected:int Lookup (const char *name);Contact **contacts; // ds cac doi tacint dirSize; // kich thuoc hien taiint 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...};
![Page 9: Bai Giang 12](https://reader036.vdocuments.pub/reader036/viewer/2022081805/547ca573b379596f2b8b501d/html5/thumbnails/9.jpg)
9
LLớớpp cơcơ ssởở riêngriêng, , chungchung vvàà đưđượợcc bbảảoo vvệệ
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ệ
……….};
protectedprivateprotectedprotectedprotected
protectedprivatepublicpublicpublic
___privateprivate
Thừa kế protectedThừa kế privateThừa kế publicLớp cơ sở
![Page 10: Bai Giang 12](https://reader036.vdocuments.pub/reader036/viewer/2022081805/547ca573b379596f2b8b501d/html5/thumbnails/10.jpg)
10
ĐaĐa ththừừaa kkếế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
OptionListdata members
Window object
Windowdata members
Menu object
OptionListdata members
Windowdata members
Menudata members
class OptionListOptionList {public:
OptionList (int n);~OptionList ();//...
};
![Page 11: Bai Giang 12](https://reader036.vdocuments.pub/reader036/viewer/2022081805/547ca573b379596f2b8b501d/html5/thumbnails/11.jpg)
11
SSựự mơmơ hhồồ trongtrong đađa ththừừaa kkếế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);….
}
GGọọii hhààmmccủủaa llớớppnnààoo ??
void main() { Menu m1(….);m1.OptionList::::Highlight(10);m1.Window::::Highlight(20);….
}
ChChỉỉ rõrõ hhààmmccủủaa llớớpp nnààoo
xxửử lýlý
HHààmm ccùùngng têntên
![Page 12: Bai Giang 12](https://reader036.vdocuments.pub/reader036/viewer/2022081805/547ca573b379596f2b8b501d/html5/thumbnails/12.jpg)
12
ChuyChuyểểnn kikiểểuuCó 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ỏ.
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ệnphải tự định nghĩa
phép ép kiểu
Window data members
OptionList data members
Window data members
Menu data members
winm
![Page 13: Bai Giang 12](https://reader036.vdocuments.pub/reader036/viewer/2022081805/547ca573b379596f2b8b501d/html5/thumbnails/13.jpg)
13
HHààmm ảảooLiên kết tĩnh (static binding):
Xác định khi biên dịch chương trình.Dùng hàm thành viên.Gọi hàm của lớp cơ sở (lớp cha).
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”);….
}GGọọii hhààmm
nnààoo ??
![Page 14: Bai Giang 12](https://reader036.vdocuments.pub/reader036/viewer/2022081805/547ca573b379596f2b8b501d/html5/thumbnails/14.jpg)
14
HHààmm ảảoo ((tttt))Liên kết động (dynamic binding)
Xác định khi thực thi chương trình.Dùng hàm ảo (virtual function).Gọi hàm của lớp dẫn xuất (lớp con).Thể hiện tính đa hình của OOP.
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”);
}
GGọọii hhààmmccủủaa llớớppnnààoo ??
KKếếtt ququảảtrêntrên
mmàànn hhììnhnhllàà ggìì??
![Page 15: Bai Giang 12](https://reader036.vdocuments.pub/reader036/viewer/2022081805/547ca573b379596f2b8b501d/html5/thumbnails/15.jpg)
15
LLớớpp cơcơ ssởở ảảoo
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
![Page 16: Bai Giang 12](https://reader036.vdocuments.pub/reader036/viewer/2022081805/547ca573b379596f2b8b501d/html5/thumbnails/16.jpg)
16
LLớớpp cơcơ ssởở ảảoo ((tttt))Cách xử lý: dùng lớp cơ sở ảo.
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
![Page 17: Bai Giang 12](https://reader036.vdocuments.pub/reader036/viewer/2022081805/547ca573b379596f2b8b501d/html5/thumbnails/17.jpg)
17
CCáácc totoáánn ttửử đưđượợcc ttááii đđịịnhnh nghnghĩĩaaTương tự như tái định nghĩa hàm thành viên:
Che giấu đi toán tử của lớp cơ sở.Hàm xây dựng sao chép:
Y::YY (const Y&)(const Y&)Phép gán:
Y& Y::operatoroperator == (const Y&)Nếu không định nghĩa, sẽ tự động có hàm xâydựng sao chép và phép gán do ngôn ngữ tạo ra.=> SAISAI khi có con trỏ thành viên.
Cẩn thận với toán tử new và delete.