Hàm tạo, hàm huỷ đối với tính thừa kế

5 408 1
Hàm tạo, hàm huỷ đối với tính thừa kế

Đang tải... (xem toàn văn)

Thông tin tài liệu

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

Ngày đăng: 24/10/2013, 15:20

Từ khóa liên quan

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan