Sự linh hoạt của phương thức ảo trong phát triển nâng cấp chương trình
Ví dụ về các lớp TS và TS2 trong
§
2 đã chỉ ra sự hạn chế của phương thức tĩnh trong việc
sử dụng tính thừa kế để nâng cấp, phát triển chương trình. Trong
§
2 cũng đã chỉ ra lớp TS2
chưa đáp ứng được yêu cầu nêu ra là in địa chỉ của thí sinh. Giải pháp cho vấn đề này rất đơn
giản: Thay các phương thức tĩnh in() bằng cách dùng chúng như các phương thức ảo. Chương
trình khi đó sẽ như sau:
//CT6-03B
// Sự linh hoạt của phương thức ảo
// 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: " ;
}
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 thí sinh in ra đã 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):
341 342
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()
{
int ch;