Sự hạn chế của phương thức tĩnh

5 371 0
Sự hạn chế của phương thức tĩnh

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

Thông tin tài liệu

Sự hạn chế của phương thức tĩnh Ví dụ sau cho thấy sự hạn chế của phương thức tĩnh trong việc sử dụng tính thừa kế để phát triển chương trình. Giả sử cần xây dựng chương trình quản lý thí sinh. Mỗi thí sinh đưa vào ba thuộc tính: Họ tên, số báo danh và tổng điểm. Chương trình gồm ba chức năng: Nhập dữ liệu thí sinh, in dữ liệu thí sinh ra máy in và xem - in (in họ tên ra màn hình, sau đó lựa chọn hoặc in hoặc không). Chương trình dưới đây sử dụng lớp TS (Thí sinh) đáp ứng được yêu cầu đặt ra. //CT6-02 // Han che phuong thuc tinh // Lop TS #include <conio.h> #include <stdio.h> #include <iostream.h> #include <ctype.h> class TS { private: char ht[25]; int sobd; float td; public: void nhap() { cout << "\nHo ten: " ; fflush(stdin); gets(ht); cout << "So bao danh: " ; cin >> sobd; cout << "Tong diem: " ; cin >> td; } void in() { fprintf(stdprn,"\n\nHo ten: %s", ht); fprintf(stdprn,"\nSo bao danh: %d", sobd); fprintf(stdprn,"\nTong diem: %0.1f", td); } void xem_in() { int ch; cout << "\nHo ten: " << ht ; cout << "\nCo in khong? - C/K" ; 323 324 ch = toupper(getch()); if (ch=='C') this->in(); } } ; void main() { TS t[100]; int i, n; cout << "\nSo thi sinh: "; cin >> n; for (i=1; i<=n; ++i) t[i].nhap(); for (i=1; i<=n; ++i) t[i].xem_in(); getch(); } Giả sử Nhà trường muốn quản lý thêm địa chỉ của thí sinh. Vì sự thay đổi ở đây là không nhiều, nên chúng ta không đả động đến lớp TS mà xây dựng lớp mới TS2 dẫn xuất từ lớp TS. Trong lớp TS2 đưa thêm thuộc tính dc (địa chỉ) và các phương thức nhap, in. Cụ thể lớp TS2 được định nghĩa như sau: class TS2:public TS { private: char dc[30] ; // Dia chi public: void nhap() { TS::nhap(); cout << "Dia chi: " ; fflush(stdin); gets(dc); } void in() { TS::in(); fprintf(stdprn,"\nDia chi: %s", dc); } }; Trong lớp TS2 không xây dựng lại phương thức xem_in, mà sẽ dùng phương thức xem_in của lớp TS. Chương trình mới như sau: 325 326 //CT6-03 // Han che phuong thuc tinh // Lop TS TS2 #include <conio.h> #include <stdio.h> #include <iostream.h> #include <ctype.h> class TS { private: char ht[25]; int sobd; float td; public: void nhap() { cout << "\nHo ten: " ; fflush(stdin); gets(ht); cout << "So bao danh: " ; cin >> sobd; cout << "Tong diem: " ; cin >> td; } void in() { fprintf(stdprn,"\n\nHo ten: %s", ht); fprintf(stdprn,"\nSo bao danh: %d", sobd); fprintf(stdprn,"\nTong diem: %0.1f", td); } void xem_in() { int ch; cout << "\nHo ten: " << ht ; cout << "\nCo in khong? - C/K" ; ch = toupper(getch()); if (ch=='C') this->in(); //Goi den TS::in() (Vi this la con tro //kieu TS) } } ; class TS2:public TS { private: char dc[30] ; // Dia chi public: void nhap() { TS::nhap(); cout << "Dia chi: " ; fflush(stdin); gets(dc); } void in() { TS::in(); fprintf(stdprn,"\nDia chi: %s", dc); } }; void main() { TS2 t[100]; int i, n; cout << "\nSo thi sinh: "; cin >> n; for (i=1; i<=n; ++i) t[i].nhap(); for (i=1; i<=n; ++i) t[i].xem_in(); getch(); } Khi thực hiện chương trình này, chúng ta nhận thấy: Dữ liệu in ra vẫn không có địa chỉ. Điều này có thể giải thích như sau: Xét câu lệnh (thứ 2 từ dưới lên trong hàm main): t[i].xem_in() ; Câu lệnh này gọi tới phương thức xem_in của lớp TS2 (vì t[i] là đối tượng của lớp TS2). Nhưng lớp TS2 không định nghĩa phương thức xem_in, nên phương thức TS::xem_in() sẽ được gọi tới. Hãy theo rõi phương thức này: void xem_in() { 327 328 int ch; cout << "\nHo ten: " << ht ; cout << "\nCo in khong? - C/K" ; ch = toupper(getch()); if(ch=='C') this->in(); //Goi den TS::in() (Vi this la con tro kieu TS) } Các lệnh đầu của phương thức sẽ in họ tên thí sinh. Nếu chọn có (bấm phím C), thì câu lệnh: this->in() ; sẽ được thực hiện. Mặc dù địa chỉ của t[i] (là đối tượng của lớp TS2) được truyền cho con trỏ this, thế nhưng câu lệnh này luôn luôn gọi tới phương thức TS::in(), vì con trỏ this ở đây có kiểu TS và vì in() là phương thức tĩnh. Kết quả là không in được địa chỉ của thí sinh. Như vậy việc sử dụng các phương thức tĩnh in() (trong các lớp TS và TS2) đã không đáp ứng được yêu cầu phát triển chương trình. Có một giải pháp rất đơn giản là: Định nghĩa các phương thức in() trong các lớp TS và TS2 như các phương thức ảo (virtual). . Sự hạn chế của phương thức tĩnh Ví dụ sau cho thấy sự hạn chế của phương thức tĩnh trong việc sử dụng tính thừa kế. này gọi tới phương thức xem_in của lớp TS2 (vì t[i] là đối tượng của lớp TS2). Nhưng lớp TS2 không định nghĩa phương thức xem_in, nên phương thức TS::xem_in()

Ngày đăng: 26/10/2013, 00: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