Hàm tạo, hàm huỷ đối với tính thừa kế 2.1. Lớp dẫn xuất không
thừa kế các
hàm tạo, hàm huỷ, toán tử gán của các lớp cơ sở 2.2. Cách xây dựng
hàm tạo của lớp dẫn xuất +
Hàm tạo cần có các
đối để khởi gán cho các thuộc
tính (thành phần dữ liệu) của lớp. + Có thể phân thuộc
tính làm 3 loại ứng
với 3 cách khởi gán khác nhau: 1. Các thuộc
tính mới khai báo trong lớp dẫn xuất. Trong các phương thức của lớp dẫn xuất có thể truy xuất đến các thuộc
tính này. Vì vậy chúng thường được khởi gán bằng các câu lệnh gán viết trong thân
hàm tạo. 2. Các thành phần kiểu
đối tượng. Trong lớp dẫn xuất không cho phép truy nhập đến các thuộc
tính của các đối tượng này. Vì vậy để khởi gán cho các
đối tượng thành phần cần dùng
hàm tạo của lớp tương ứng. Điều này đã trình bầy trong mục § 8 chương 4. 3. Các thuộ
c tính thừa kế từ các lớp cở sở. Trong lớp dẫn xuất không được phép truy nhập đến các thuộc
tính này. Vì vậy để khởi gán cho các thuộc
tính nói trên, cần sử dụng
hàm tạo của lớp cơ sở. Cách thức cũng giống như khởi gán cho các
đối tượng thành phần, chỉ khác nhau ở chỗ: Để khởi gán cho các
đối tượng thành phần ta dùng tên
đối tượng thành phần, còn để khởi gán cho các thuộ
c tính thừa kế từ các lớp cơ sở ta dùng tên lớp cơ sở: Tên_đối_tượng_thành_phần(danh sách giá trị) Tên_lớp_cơ_sở(danh sách giá trị) Danh sách giá trị lấy từ
các đối của hàm tạo của lớp dẫn xuất đang xây dựng (xem ví dụ mục 2.4 và § 6, ví dụ 1) 2.3.
Hàm huỷ Khi một
đối tượng của lớp dẫn xuất được giải phóng (bị huỷ), thì các
đối tượng thành phần và các
đối tượng
thừa kế từ các lớp cơ sở cũng bị giải phóng theo. Do đó các
hàm huỷ tương ứng sẽ được gọi đến. Như vậy khi xây dựng
hàm huỷ của lớp dẫn xuất, chúng ta chỉ cần quan tâm đến các thuộc
tính (không phải là
đối tượng) khai báo thêm trong lớp dẫn xuất mà thôi. Ta không cần để ý đến các
đối tượng thành phần và các thuộ
c tính thừa kế từ các lớp cơ sở. (xem ví dụ mục 2.4 và § 6, ví dụ 2) 2.4. Ví dụ xét các lớp + Lớp NGUOI gồm: - Các thuộc
tính char *ht ; // Họ tên int ns ; - Hai
hàm tạo, phương thức in() và
hàm huỷ + Lớp MON_HOC gồm: - Các thuộc
tính char *monhoc ; // Tên môn học 245 246 int st ; // Số tiết - Hai
hàm tạo, phương thức in() và
hàm huỷ + Lớp GIAO_VIEN : -
Kế thừa từ lớp NGUOI - Đưa thêm các thuộc
tính char *bomon ; // Bộ môn công tác MON_HOC mh ; // Môn học đang dậy - Hai
hàm tạo , phương thức in() và
hàm huỷ Hãy để ý cách xây dựng các
hàm tạo, hàm huỷ của lớp dẫn xuất GIAO_VIEN. Trong lớp GIAO_VIEN có thể gọi tới 2 phương thức in(): GIAO_VIEN::in() // Được xây dựng trong lớp GIAO_VIEN NGUOI::in() //
Thừa kế từ lớp NGUOI Hãy chú ý cách gọi tới 2 phương thức in() trong chương trình dưới đây. //CT5-03 //
Ham tao cua lop dan suat #include <conio.h> #include <iostream.h> #include <string.h> class MON_HOC { private: char *monhoc; int st; public: MON_HOC() { monhoc=NULL; st=0; } MON_HOC(char *monhoc1, int st1) { int n = strlen(monhoc1); monhoc = new char[n+1]; strcpy(monhoc,monhoc1); st=st1; } ~ MON_HOC() { if (monhoc!=NULL) { 247 248 delete monhoc; st=0; } } void in() { cout << "\nTen mon: " << monhoc << " so tiet: " << st; } } ; class NGUOI { private: char *ht; int ns; public: NGUOI() { ht=NULL; ns=0; } NGUOI(char *ht1, int ns1) { int n = strlen(ht1); ht = new char[n+1]; strcpy(ht,ht1); ns=ns1; } ~NGUOI() { if (ht!=NULL) { delete ht; ns=0; } } void in() { cout << "\nHo ten : " << ht << " nam sinh: " << ns; } } ; 249 250 class GIAO_VIEN : public NGUOI { private: char *bomon; MON_HOC mh; public: GIAO_VIEN():mh(),NGUOI()//Su dung
ham tao khong
doi { bomon=NULL; } GIAO_VIEN(char *ht1, int ns1, char *monhoc1,int st1, char *bomon1 ): NGUOI(ht1,ns1),mh(monhoc1, st1) { int n = strlen(bomon1); bomon = new char[n+1]; strcpy(bomon,bomon1); } ~GIAO_VIEN() { if (bomon!=NULL) delete bomon; } void in() { // Su dung phuong thuc in NGUOI::in(); cout << "\n Cong tac tai bo mon: " << bomon; mh.in(); } }; void main() { clrscr(); GIAO_VIEN g1; // Goi toi cac
ham tao khong
doi GIAO_VIEN *g2; //Goi toi cac
ham tao co
doi g2 = new GIAO_VIEN("PHAM VAN AT", 1945, "CNPM", 60, "TIN HOC"); g2->in(); /* co the viet g2->GIAO_VIEN::in(); */ g2->NGUOI::in(); getch(); delete g2; // Goi toi cac
ham huy getch(); } . Hàm tạo, hàm huỷ đối với tính thừa kế 2.1. Lớp dẫn xuất không thừa kế các hàm tạo, hàm huỷ, toán tử gán của các lớp cơ sở 2.2. Cách xây dựng hàm tạo. được giải phóng (bị huỷ) , thì các đối tượng thành phần và các đối tượng thừa kế từ các lớp cơ sở cũng bị giải phóng theo. Do đó các hàm huỷ tương ứng sẽ được