đa hình

Chương 5 Phương th c o và tính ứ ả

5.1 Bài toán qu n lý m t danh sách các

đ

ộ i tố ư ng khác ki u ể ọ

ợ 5.2 Vùng ch n ki u ể 5.3 Phương th c o ứ ả t l p o 5.4 Phương th c thi ế ậ ả ứ ý 5.5 Phương th c o thu n tu ầ ứ ả

1

5.1 Bài toán qu n lý m t danh sách các

đ i tố ư ng khác ợ

- Gi ả ợ ể

i quy t hai v n

ki uể s ta c n qu n lý m t danh sách các ả ử ầ ể

ế ả đ i tố ư ng có ki u ấ đ : ề Cách lưu trữ

- Xét trư ng h p c th , các ợ ụ ể đ i tố ư ng có th là ng ể ợ ư i, sinh ờ

viên ho c công nhân. ộ ầ có th khác nhau, ta c n gi và thao tác x lýử . ờ ặ

ể - V lề ưu tr :ữ Ta có th dùng union, trong tr ờ ỗ

ư c ch a ợ ợ ớ

ợ ớ ớ

ế ằ

ư ng h p này m i ứ đư c ợ đ i tố ư ng có kích ưu tr . ữ đúng kích thư c ớ ỏ đ ể ưu tr ữ đ i tố ư ng b ng ợ ả

đ i tố ư ng ph i có kích th ả thư c l n nh t. Đi u này gây lãng phí không gian l ề ấ M t cách thay th là l ộ c a nó và dùng m t danh sách (m ng, dslk,...) các con tr ủ qu n lý các

ộ đ i tố ư ng. ợ ả ả ả ề

ớ ợ

2

- V thao tác, ph i tho yêu c u khác nhau ng v i các lo i vùng ch n ki u gi ọ ứ i quy t là ế ầ đa hình: Thao tác có ho t ạ đ ng ộ ạ đ i tố ư ng khác nhau. Có hai cách ứ ả . ể và phương th c o ả

5.2 Dùng vùng ch n ki u ể

 V lề ưu tr :ữ Ta s dùng m t m ng các con tr ẽ ả ộ ỏ đ n l p c ế ớ ơ s ở

ể ỏ đ n các ế ộ ớ ợ

đ có th tr ể ờ  Xét l p Ng ớ

đ i tố ư ng thu c l p con. ư i và các l p k th a sinh viên và công nhân. ớ ế ừ ấ ầ ả đ m thao tác xu t áp ả

3

Thao tác ta quan tâm là xuat. Ta c n b o d ng cho l p sinh viên và l p công nhân khác nhau. ụ ớ ớ

Dùng vùng ch n ki u ể

class Nguoi { protected:

char *HoTen; int NamSinh;

public:

Nguoi(char *ht, int ns):NamSinh(ns) {HoTen = strdup(ht);} ~Nguoi() {delete [] HoTen;} void An() const { cout << HoTen << " an 3 chen com";} void Ngu() const { cout << HoTen << " ngu ngay 8 tieng";} void Xuat() const { cout << "Nguoi, ho ten: " << HoTen << " sinh " << NamSinh; }

};

4

Dùng vùng ch n ki u ể

class SinhVien : public Nguoi { protected:

char *MaSo;

public:

SinhVien(char *n, char *ms, int ns) : Nguoi(n,ns) { MaSo = strdup(ms);} ~SinhVien() {delete [] MaSo;} void Xuat() const { cout << "Sinh vien " << HoTen << ", ma so " << MaSo;}

}; class NuSinh : public SinhVien { public:

NuSinh(char *ht, char *ms, int ns) : SinhVien(ht,ms,ns) {} void An() const { cout << HoTen << " ma so " << MaSo << " an 2 to pho";}

};

5

Dùng vùng ch n ki u ể

class CongNhan : public Nguoi { protected:

double MucLuong;

public:

CongNhan(char *n, double ml, int ns) : Nguoi(n,ns), MucLuong(ml) { } void Xuat() const { cout << "Cong nhan, ten " << HoTen << " muc luong: " << MucLuong;}

}; void XuatDs(int n, Nguoi *an[]) {

for (int i = 0; i < n; i++) {

an[i]->Xuat(); cout << "\n";

}

}

6

Dùng vùng ch n ki u ể

const int N = 4; void main() {

Nguoi *a[N]; a[0] = new SinhVien("Vien Van Sinh", ”200001234", 1982); a[1] = new NuSinh("Le Thi Ha Dong", ”200001235", 1984); a[2] = new CongNhan("Tran Nhan Cong", 1000000, 1984); a[3] = new Nguoi("Nguyen Thanh Nhan", 1960); XuatDs(4,a);

}

7

Dùng vùng ch n ki u ể

ọ ương trình trên như sau:

 Xu t li u cho ấ ệ

đi m nh

ứ ả

ể ả đ m xu t li u t ợ

ữ ệ ộ ạ

đo n chạ Nguoi, ho ten: Vien Van Sinh sinh 1982 Nguoi, ho ten: Le Thi Ha Dong sinh 1984 Nguoi, ho ten: Tran Nhan Cong sinh 1984 Nguoi, ho ten: Nguyen Thanh Nhan sinh 1960  T t c m i ư ngư i vì đ u ề đư c quan ấ ả ọ đ i tố ư ng ợ ờ ể ợ ư i.ờ ỏ đ n l p Ng thao tác đư c th c hi n thông qua con tr ế ớ ệ ợ ự  Đ b o ớ đ i tố ư ng, ph i có ấ ệ ương ng v i ả ợ ệ đ i tố ư ng, ta thêm m t vùng d li u vào l p cách nh n di n ớ ộ ậ cơ s ở đ nh n di n, vùng này có giá tr ph thu c vào lo i ị ụ ệ ể ậ đư c g i là vùng ch n ki u. c a ủ đ i tố ư ng và ể ọ ợ ọ ợ  Các đ i tố ư ng thu c l p ng ư i có cùng giá tr cho vùng ch n ọ ị ộ ớ ợ đ i tố ư ng thu c l p sinh viên có giá tr c a vùng ộ ớ ị ủ

8

ki u, các ch n ki u khác c a l p ng ể ợ ủ ớ ể ọ ư i.ờ

Dùng vùng ch n ki u ể

class Nguoi { public:

enum LOAI {NGUOI, SV, CN};

protected:

char *HoTen; int NamSinh;

public:

LOAI pl; Nguoi(char *ht, int ns):NamSinh(ns), pl(NGUOI) {HoTen = strdup(ht);} ~Nguoi() {delete [] HoTen;} void An() const { cout << HoTen << " an 3 chen com";} void Ngu() const { cout << HoTen << " ngu ngay 8 tieng";} void Xuat() const { cout << "Nguoi, ho ten: " << HoTen << " sinh " << NamSinh; }

};

9

Dùng vùng ch n ki u ể

class SinhVien : public Nguoi { protected:

char *MaSo;

public:

SinhVien(char *n, char *ms, int ns) : Nguoi(n,ns) { MaSo = strdup(ms); pl = SV;} ~SinhVien() {delete [] MaSo;} void Xuat() const { cout << "Sinh vien " << HoTen << ", ma so " << MaSo;}

}; class NuSinh : public SinhVien { public:

NuSinh(char *ht, char *ms, int ns) : SinhVien(ht,ms,ns) {} void An() const { cout << HoTen << " ma so " << MaSo << " an 2 to pho";}

};

10

Dùng vùng ch n ki u ể

class CongNhan : public Nguoi { protected:

double MucLuong;

public:

CongNhan(char *n, double ml, int ns) : Nguoi(n,ns), MucLuong(ml) { pl = CN;} void Xuat() const { cout << "Cong nhan, ten " << HoTen << " muc luong: " << MucLuong;}

};

 Khi thao taùc ta phaûi caên cöù vaøo giaù trò cuûa

11

vuøng choïn kieåu ñeå “eùp kieåu” phuø hôïp.

Dùng vùng ch n ki u ể

void XuatDs(int n, Nguoi *an[]) {

for (int i = 0; i < n; i++) {

switch(an[i]->pl) {

case Nguoi::SV:

((SinhVien *)an[i])->Xuat(); break;

case Nguoi::CN:

((CongNhan *)an[i])->Xuat(); break;

default:

an[i]->Xuat(); break;

} cout << "\n";

}

12

}

Dùng vùng ch n ki u ể

const int N = 4; void main() {

Nguoi *a[N]; a[0] = new SinhVien("Vien Van Sinh", "200001234", 1982); a[1] = new NuSinh("Le Thi Ha Dong", "200001235", 1984); a[2] = new CongNhan("Tran Nhan Cong", 1000000, 1984); a[3] = new Nguoi("Nguyen Thanh Nhan", 1960); XuatDs(4,a);

}

Sinh vien Vien Van Sinh, ma so 200001234 Sinh vien Le Thi Ha Dong, ma so 200001235 Cong nhan, ten Tran Nhan Cong muc luong: 1000000 Nguoi, ho ten: Nguyen Thanh Nhan sinh 1960

13

 Xuaát lieäu cuûa ñoaïn chöông trình treân seõ laø:

Dùng vùng ch n ki u ể

14

Dùng vùng ch n ki u ể ọ ợ ấ đ : Lể ưu tr ữ đư c ợ ế đư c v n ương

 Cách ti p c n trên gi ế ậ ợ

ớ đ i tố ư ng. Tuy nhiên nó có các nh ư c ợ đi m sau: ể

ợ ớ

i quy t ả các đ i tố ư ng khác ki u nhau và thao tác khác nhau t ể ng v i ứ – Dài dòng v i nhi u switch, case. – D sai sót, khó s a vì trình biên d ch b c ề ử ị ị ơ ch ép ki u che ể ế

ễ m t.ắ

– Khó nâng c p ví d thêm m t lo i ộ ạ đ i tố ư ng m i, ợ ớ đ c ặ

bi ệ

ấ ụ ương trình l n.ớ t khi ch  Các như c ợ đi m trên có th ể ợ ể đư c kh c ph c nh ph ờ ương ụ ắ

15

th c o. ứ ả

 Con tr thu c l p c ộ ớ ơ s có th tr ở ỏ

5.3 Phương th c o ứ ả ể ỏ đ n l p con: ế ớ

Nguoi* pn = new SinhVien(“Le Vien Sinh”, 200001234, 1982);

 Ta mong mu n thông qua con tr thu c l p c ố ỏ ể

ộ ớ ơ s có th truy ở l p con: ấ ầ đư c ợ đ nh nghĩa l ị ạ ở ớ

// vien, thuc te: goi Xuat cua lop // Nguoi

i xu t hàm thành ph n pn->Xuat(); // Mong muon: goi Xuat cua lop sinh

ế ấ đ . Ta qui i quy t v n ề ả ương th c o b ng cách thêm t ằ ứ ả đ nh m t ộ ị khoá ừ

 Phương th c o cho phép gi ứ ả hàm thành ph n là ph ầ virtual vào trư c khai báo hàm. ớ

khoá virtual vào tr  Trong ví d trên, ta thêm t ụ ừ ư c khai báo ớ

16

c a hàm xuat. ủ

Phương th c o ứ ả

class Nguoi { protected:

char *HoTen; int NamSinh;

public:

Nguoi(char *ht, int ns):NamSinh(ns) {HoTen = strdup(ht);} ~Nguoi() {delete [] HoTen;} void An() const { cout << HoTen << " an 3 chen com";} void Ngu() const { cout << HoTen << " ngu ngay 8 tieng";} virtual void Xuat() const { cout << "Nguoi, ho ten: " << HoTen << " sinh " << NamSinh; }

};

17

Phương th c o ứ ả class SinhVien : public Nguoi { protected:

char *MaSo;

public:

SinhVien(char *n, char *ms, int ns) : Nguoi(n,ns) { MaSo = strdup(ms);} ~SinhVien() {delete [] MaSo;} void Xuat() const { cout << "Sinh vien " << HoTen << ", ma so " << MaSo;}

}; class NuSinh : public SinhVien { public:

NuSinh(char *ht, char *ms, int ns) : SinhVien(ht,ms,ns) {} void An() const { cout << HoTen << " ma so " << MaSo << " an 2 to pho";}

};

18

Phương th c o ứ ả class CongNhan : public Nguoi { protected:

double MucLuong;

public:

CongNhan(char *n, double ml, int ns) : Nguoi(n,ns), MucLuong(ml) { } void Xuat() const { cout << "Cong nhan, ten " << HoTen << " muc luong: " << MucLuong;}

};

void XuatDs(int n, Nguoi *an[]) {

for (int i = 0; i < n; i++) {

an[i]->Xuat(); cout << "\n";

}

}

19

Phương th c o ứ ả

const int N = 4; void main() {

Nguoi *a[N]; a[0] = new SinhVien("Vien Van Sinh", "200001234", 1982); a[1] = new NuSinh("Le Thi Ha Dong", "200001235", 1984); a[2] = new CongNhan("Tran Nhan Cong", 1000000, 1984); a[3] = new Nguoi("Nguyen Thanh Nhan", 1960); XuatDs(4,a);

}

 Phöông thöùc aûo xuat ñöôïc khai baùo ôû lôùp

20

Nguoi cho pheùp söû duïng con troû ñeán lôùp cô sôû (Nguoi) nhöng troû ñeán moät ñoái töôïng thuoäc lôùp con (Sinh vieân, coâng nhaân) goïi ñuùng thao taùc ôû lôùp con:

Phương th c o ứ ả

Nguoi *pn; pn = new SinhVien("Vien Van Sinh", "200001234",

1982);

pn->Xuat(); // Goi thao tac xuat cua lop Sinh vien

 Con troû pn thuoäc lôùp Nguoi nhöng troû ñeán ñoái töôïng sinh vieân, vì vaäy pn->Xuat() thöïc hieän thao taùc xuaát cuûa lôùp sinh vieân.

 Trôû laïi ví duï treân, khi i a[i] laàn löôït troû ñeán

caùc ñoái töôïng thuoäc caùc loaïi khaùc nhau, thao taùc töông öùng vôùi lôùp seõ ñöôïc goïi.

 Duøng phöông thöùc aûo khaéc phuïc ñöôïc caùc nhöôïc ñieåm cuûa caùch tieáp caän duøng vuøng choïn kieåu:

21

 Thao taùc ñôn giaûn khoâng phaûi duøng switch/case vì vaäy khoù sai, deã söûa.

ứ ả ữ ệ

ạ đ i tố ư ng m i r t ợ ấ ử ả

ầ ỉ ử

ế ừ ừ ớ ơ s ho c các l p con ở ặ

ớ l p m i t o n u c n i ph l p c ứ ả ở ớ ương th c ( o) ớ ạ ế ầ

Thêm l p con m i ớ ớ  Dùng phương th c o, ta d dàng nâng c p s a ch a. Vi c ễ ớ ấ đơn gi n, ta không c n ph i thêm m t lo i ả ộ s a ử đ i thao tác x lý (hàm XuatDs). Qui trình thêm ch là xây ổ đã có và d ng l p con k th a t ớ ự đ nh nghĩa l ạ ị class CaSi : public Nguoi { protected:

double CatXe;

public:

CaSi(char *ht, double cx, int ns) : Nguoi(ht,ns), CatXe(cx) {} void Xuat() const { cout << "Ca si, " << HoTen << " co cat xe " << CatXe;}

};

22

Thêm l p con m i ớ void XuatDs(int n, Nguoi *an[]) {

for (int i = 0; i < n; i++) {

an[i]->Xuat(); cout << "\n";

}

}

 Haøm XuatDs khoâng thay ñoåi, nhöng noù coù theå hoaït ñoäng cho caùc loaïi ñoái töôïng ca só thuoäc lôùp môùi ra ñôøi.

23

 Coù theå xem nhö thao taùc XuatDs ñöôïc vieát tröôùc cho caùc lôùp con chaùu chöa ra ñôøi.

Các lưu ý khi s d ng ph

l p c

ương th c o ử ụ ứ ả  Phương th c o ch ho t ạ đ ng thông qua con tr . ộ ỏ ứ ả  Mu n m t hàm tr thành ph ương th c o có hai cách: Khai ặ

ứ ả ương ng ứ ở ớ ơ s ở đã là

ộ ố báo v i t ớ ừ phương th c o.

l p c khoá virtual ho c hàm t ứ ả  Phương th c o ch ho t ứ ả ở ớ ơ s và ở ỉ

ứ ệ

l p con i ph l p con có nghi th c giao ti p gi ng h t nhau. ớ  N u ế ở ớ ẽ ọ

24

đ nh nghĩa l ị l p c ạ đ ng n u các hàm ế ố ương th c o thì s g i ứ ả đ nh nghĩa). ị ộ ế ạ ở ầ phương th c ứ ở ớ ơ s (g n nh t có ấ

Ví d thêm v ph

 M t ví d t

ề ương th c o ứ ả ứ ả

ụ ụ ương t m t danh sách các

25

ương th c o là qu n lý mamal.cpp ộ ộ v s d ng ph ự ề ử ụ đ ng v t. Xem ậ ộ

ế ự

ệ  Khi g i m t thao tác, kh n

ương th c o ứ ả ả ăng ch n ọ đúng phiên b n tuỳ theo ả ế ớ ơ s ở ỏ đ n l p c

 Cơ ch ế đa hình đư c th c hi n nh ợ

Cơ ch th c hi n ph ộ ọ đ th c hi n thông qua con tr đ i tố ư ng ợ ể ự đa hình (polymorphisms). đư c g i là tính ợ ọ ệ ả

m i ương th c o. B ng này ch a ự ứ ả ộ ả ị

ờ ở ỗ đ i tố ư ng có thêm ợ ứ đ a ch c a các ỉ ủ ị đư c trình biên d ch kh i t o m t cách ở ạ ứ ả ộ

m t b ng ph phương th c o và nó ng m ầ đ nh khi thi ị ợ ợ ế ậ đ i tố ư ng.ợ  Khi thao tác đư c th c hi n thông qua con tr , hàm có ệ t l p ự đ a ch ỉ ị ỏ

ợ ọ trong b ng ph ả ương th c o s

ư i có ờ

là  Trong ví d trên, m i ụ ứ ả ỉ

ả ợ

26

ứ ả ẽ đư c g i. ộ ớ ơ s Ngở ỗ đ i tố ư ng thu c l p c ương th c o có m t ph n t ầ ử đ a ch hàm ị ộ ớ ỉ ủ ợ b ng ph ộ ả Nguoi::Xuat. M i ỗ đ i tố ư ng thu c l p SinhVien có b ng đ a ch c a hàm SinhVien::Xuat. tương t ị nhự ưng n i dung là ộ

 Trong ví d 2, m i

ương th c o Cơ ch th c hi n ph ứ ả ệ ế ự ỗ đ i tố ư ng thu c các l p Mamal, Dog, Cat, ớ ộ ụ ợ ầ ử đ a ị , ương th c o v i hai ph n t Horse, Pig đ u có b ng ph ứ ả ớ ề ch c a hàm Speak và c a hàm Move.

27

ỉ ủ ủ

28

 Trong ví d qu n lý danh sách các

Phương th c hu b o ỷ ỏ ả ứ đ i tố ư ng thu c các l p ợ

ớ ụ ả

ọ ẹ đ i tố ư ng ợ

t. ế

Nguoi *a[N]; a[0] = new SinhVien("Vien Van Sinh", "20001234", 1982); a[1] = new NuSinh("Le Thi Ha Dong", "20001235", 1984); a[2] = new CongNhan("Tran Nan Cong", 1000000, 1984); a[3] = new Nguoi("Nguyen Thanh Nhan", 1960); XuatDs(4,a); for (int i = 0; i < 4; i++)

ộ Nguoi, SinhVien, CongNhan, … Thao tác d n d p là c n thi ầ const int N = 4; void main() {

delete a[i];

}

29

Phương th c hu b o ỷ ỏ ả ứ  Thông qua con tr thu c l p c ỏ

ở ỉ ương th c ứ

ộ ớ ơ s Nguoi, ch có ph đư c g i. ợ ọ

đ y ầ đ , ta dùng ph ủ ương th c ứ ệ ọ ẹ

char *HoTen; int NamSinh;

public:

hu b c a l p Nguoi ỷ ỏ ủ ớ  Đ b o ể ả đ m vi c d n d p là ả hu b o. ỷ ỏ ả class Nguoi { protected:

Nguoi(char *ht, int ns):NamSinh(ns) {HoTen = strdup(ht);} virtual ~Nguoi() {delete [] HoTen;} virtual void Xuat(ostream &os) const { os << "Nguoi, ho ten: " << HoTen << " sinh " << NamSinh; } void Xuat() const { Xuat(cout); }

};

30

5.4 Phương th c thi

ứ  C++ không cung c p cấ ơ ch thi

t l p o ế ậ ả ế ậ đ i tố ư ng có kh n ợ

ả ăng ế

đa hình theo cơ ch hàm thành ph n o.

 Tuy nhiên ta có th “thu x p” ể ạ đ i tố ư ng theo ợ ế ể t l p ầ ả ế đ có th t o

ệ ả  Phương th c thi nghĩa “ o”. Xem ví d ứ ể đư c hi n th c b ng ự ằ

31

cách dùng hàm thành ph n tĩnh ể ụ pttl_ao.cpp t l p o cũng có th ợ ể ạ đ i tố ư ng. đ t o ế ậ ả ầ ợ

t l p o ế ậ ả

Phương th c thi enum FILETYPE {UNKNOWN, BMP, GIF, JPG}; class CGBmp; typedef CGBmp * CGBmpPtr; class CGBmp { protected: // ...

public:

virtual ~CGBmp(){Release();} virtual void Release() = 0; static CGBmpPtr NewBmp(const String &pathName); virtual void Draw() const;

};

32

Phương th c thi

t l p o ế ậ ả

class CBmp : public CGBmp { //... public:

CBmp(const String &pathName); void Release(); void Draw() const;

//... }; class CGif: public CGBmp { //.. public:

CGif(const String &pathName); void Release(); void Draw() const;

//... };

33

Phương th c thi

t l p o ế ậ ả

class CJpg: public CGBmp { //.. public:

CJpg(const String &pathName); void Release(); void Draw() const;

//... }; FILETYPE GetFileType(const String &pathName) {

String FileExt = GetFileExt(pathName); if (FileExt == ".DIB" || FileExt == ".BMP")

return BMP;

else if (FileExt == ".JPG")

return JPG;

else if (FileExt == ".GIF")

return GIF;

else return UNKNOWN;

}

34

Phương th c thi

t l p o ế ậ ả

ứ CGBmpPtr CGBmp::NewBmp(const String &pathName) {

switch (GetFileType(pathName)) { case BMP:

return new CBmp(pathName);

case GIF:

return new CGif(pathName);

case JPG:

return new CJpg(pathName);

default:

return NULL;

}

} void main() {

CGBmpPtr p = CGBmp::NewBmp("Lena.jpg"); p->Draw();

}

35

ứ ả

ớ ơ s tr u t

ở ừ ư ngợ

5.5 Phương th c o thu n tuý và l p c  L p cớ ơ s tr u t

ớ ơ s không có ở

đ i tố ư ng nào ợ ở ừ ư ng ợ ộ ớ ơ s tr u t

ở ừ ư ng là l p c ợ ộ đ i tố ư ng thu c l p c thu c chính nó. M t ph i thu c m t trong các l p con. ợ ớ ộ ả ộ

 Xét các l p Circle, Rectangle, Square k th a t l p Shape, ộ ớ ế ừ ừ ớ

 Trong ví d trên, các hàm trong l p Shape có n i dung nh xem chương trình ngu n ồ pta_tt.cpp ớ ụ ộ

ộ ớ

ưng n i dung không có ý nghĩa. Đ ng th i ta luôn luôn có th t o ộ ể ạ ồ đúng v i tớ ư đư c ợ đ i tố ư ng thu c l p Shape, ợ tư ng c a ph đi u này không đ i tố ư ng. ở ợ

ờ ề ương pháp lu n hậ ư ng ớ  Ta có th thay th cho n i dung không có ý nghĩa b ng ộ ủ ể ế ằ

ầ ương th c o thu n tuý là ứ ả ầ

36

phương th c o thu n tuý. Ph phương th c o không có n i dung. ộ ứ ả ứ ả

ứ ả

Phương th c o thu n tuý và l p c ớ

ầ ứ ả

 Khi l p có ph ớ ầ ớ ơ s ở

ở ừ ư ngợ ớ ơ s tr u t ương th c o thu n tuý, l p tr thành l p c ở ộ ớ ơ s ở

ể ạ đ i tố ư ng thu c l p c ợ ợ

tr u từ ư ng. Ta không th t o thu n tuý. ầ

ưng ch có ỉ ầ ứ ả

các đ i tố ư ng thu c l p con có th g i nó. Xem

 Ta có th ể đ nh nghĩa ph ị ộ ớ ợ ụ ứ ả ầ ả ể ạ đư c ợ

pta_tt2  Trong ví d trên, các hàm thành ph n trong l p Shape là ớ ả đ m không th t o ụ ộ ớ ợ

đ nh nghĩa n i ộ ị đ i ố ưng ch có các ỉ

ương th c o thu n tuý, nh ể ọ ầ phương th c o thu n tuý. Nó b o đ i tố ư ng thu c l p Shape. Ví d trên cũng dung cho phương th c o thu n tuý, nh ầ ứ ả tư ng thu c l p con có th g i. ể ọ ợ

 Phương th c o thu n tuý có ý nghĩa cho vi c t

ỗ ố ộ ớ ứ ả ớ

37

ệ ổ ứ ơ đ ồ ch c s ầ đóng vai trò ch a s n ch tr ng cho các phân c p các l p, nó ấ l p con ớ ề ớ ừ ẵ đi n vào v i phiên b n phù h p. ợ ả

Phương th c o thu n tuý và l p c ầ ủ ớ ơ s tr u t

ở ừ ư ng cũng có th là ả

ứ ả  B n thân các l p con c a l p c ớ l p cớ ơ s tr u t

ở ừ ư ngợ ớ ơ s tr u t ể ợ ư ví d ụ pta_tt3.cpp.

38

ở ừ ư ng, nh ợ