Giáo trình Lập trình hướng đối tượng (Phần 2)
Sự dẫn xuất và tính thừa kế
3.1.1. Lớp cơ sở và lớp dẫn xuất
Lập trình hướng đối tượng có hai đặc trưng cơ bản:
? Đóng gói dữ liệu, được thể hiện bằng cách dùng khái niệm lớp để biểu
diễn đối tượng với các thuộc tính private, chỉ cho phép bên ngoài truy nhập
vào thông qua các phương thức.
? Dùng lại mã, thể hiện bằng việc thừa kế giữa các lớp. Việc thừa kế cho
phép các lớp thừa kế (gọi là lớp dẫn xuất) sử dụng lại các phương thức đã
được định nghĩa trong các lớp gốc (gọi là lớp cơ sở).
Một lớp có thể được dẫn xuất từ nhiều lớp cơ sở, một lớp cơ sở cũng có thể là
lớp cơ sở của nhiều lớp dẫn xuất.
3.1.2. Cách xây dựng lớp dẫn xuất
Cú pháp khai báo một lớp thừa kế từ một lớp khác như sau:
class
{
// Khai báo các thành phần của lớp
};
Trong đó:
Tên lớp dẫn xuất: là tên lớp được cho thừa kế từ lớp khác. Tên lớp này tuân
thủ theo quy tắc đặt tên biến trong C++.
Tên lớp cở sở: là tên lớp đã được định nghĩa trước đó để cho lớp khác thừa kế.
Tên lớp này cũng tuân thủ theo quy tắc đặt tên biến của C++.
Từ khóa dẫn xuất: là từ khóa quy định tính chất của sự thừa kế. Có ba từ khóa
dẫn xuất là private, protected và public.
Ví dụ 3.1:
class Bus: public Car
{
// Khai báo các thành phần
};
là khai báo một lớp Bus (xe buýt) thừa kế từ lớp Car (xe ô tô) với tính chất thừa
kế là public.
Trang 1
Trang 2
Trang 3
Trang 4
Trang 5
Trang 6
Trang 7
Trang 8
Trang 9
Trang 10
Tải về để xem bản đầy đủ
Tóm tắt nội dung tài liệu: Giáo trình Lập trình hướng đối tượng (Phần 2)
.display(); getch(); break; case 'b': char ma[5]; cout<<"So hoa don:"; cin.ignore(); cin.getline(ma,5); hdl.find_tt(ma); getch(); break; case 'c': hoadon x; clrscr(); cout<<"Nhap thong tin ve hoa don bo sung\n"; cin>>x; hdl.add(x); hdl.ghi_bs("hoadon.txt",x); break; case 'd': cout<<"So hoa don:"; cin.getline(ma,5); hdl.remove(ma); hdl.ghi_tep("hoadon.txt"); break; case 'e': Trang - 241 - Lập trình h•ớng đối t•ợng cout<<"Co tat ca "<<hdl.count()<<" hoa don"; getch(); break; case 'f': cout<<"Ma nhan vien:"; cin.getline(ma,5); cout<<"Nhan vien da ban duoc:"<<hdl.tk_nv(ma)<<"$"; getch(); break; case 'g': cout<<"Ma khach hang:"; cin.getline(ma,5); cout<<"Khach hang da mua hang het:"<<hdl.tk_kh(ma)<<"$"; getch(); break; case 'h': cout<<"Ma mat hang:"; cin.getline(ma,5); cout<<"Mat hang da ban duoc:"<<hdl.tk_mh(ma)<<"$"; getch(); break; } } while(lc!='r'); break; case 7: list ccl; ccl.doc_tep("nhacc.txt"); do { clrscr(); cout<<"\na. Hien thi danh sach nha cung cap"; cout<<"\nb. Tim kiem"; cout<<"\nc. Bo sung nha cung cap vao danh sach"; cout<<"\nd. Loai bo nha cung cap khoi danh sach:"; cout<<"\ne. Thong ke so nha cung cap"; cout<<"\nf. Tim cac mat hang"; cout<<"\ng. Quay lai(nhan r):"; cout<<"\n Ban chon:"; cin>>lc; switch(lc) { case 'a': ccl.display(); Trang - 242 - Lập trình h•ớng đối t•ợng getch(); break; case 'b': char ma[5]; cout<<"Ma nha cung cap:"; cin.ignore(); cin.getline(ma,5); ccl.find_tt(ma); getch(); break; case 'c': nhacungcap x; clrscr(); cout<<"Nhap thong tin ve nha cung cap bo sung\n"; cin>>x; ccl.add(x); ccl.ghi_bs("nhacc.txt",x); break; case 'd': cout<<"Ma nha cung cap:"; cin.getline(ma,5); ccl.remove(ma); ccl.ghi_tep("nhacc.txt"); break; case 'e': cout<<"Co tat ca "<<ccl.count()<<" nha cung cap"; getch(); break; case 'f': list l; l.doc_tep("mathang.txt"); cout<<"Ma nha cung cap:"; cin.getline(ma,5); l.find_tt(ma); getch(); break; } } while(lc!='r'); break; } } while (chon!=8); } Trang - 243 - Lập trình h•ớng đối t•ợng Câu hỏi và bài tập 1. Muốn mở một tệp tin tên là abc.txt để đọc dữ liệu, lệnh mở tệp nào sau đây là đúng: a. fstream myFile(“abc.txt”, ios::in); b. fstream myFile(“abc.txt”, ios::out); c. fstream myFile(“abc.txt”, ios::app); d. fstream myFile(“abc.txt”, ios::ate); 2. Muốn mở một tệp tin abc.txt nằm trong th• mục xyz để ghi dữ liệu vào. Lệnh mở nào sau đây là đúng: a. fstream myFile(“xyz\abc.txt”, ios::out); b. fstream myFile(“xyz\\abc.txt”, ios::out); c. fstream myFile(“xyz/abc.txt”, ios::out); d. fstream myFile(“xyz//abc.txt”, ios::out); 3. Muốn mở một tệp tin abc.txt để ghi thêm dữ liệu vào cuối tệp, lệnh nào sau đây là đúng: a. fstream myFile(“abc.txt”, ios::out); b. fstream myFile(“abc.txt”, ios::app); c. fstream myFile(“abc.txt”, ios::out|ios::app); d. fstream myFile(“abc.txt”, ios::out||ios::app); 4. Xét hai lệnh khai báo sau: fstream myFile1(“abc.txt”, ios::out); ofstream myFile2(“abc.txt”, ios::out); nhận định nào sau đây là đúng: a. myFile1 và myFile2 có chức năng giống nhau. b. myFile1 và myFile2 có chức năng khác nhau 5. Xét hai lệnh khai báo sau: fstream myFile1(“abc.txt”, ios::in); ifstream myFile2(“abc.txt”, ios::in); nhận định nào sau đây là đúng: a. myFile1 và myFile2 có chức năng giống nhau. b. myFile1 và myFile2 có chức năng khác nhau Trang - 244 - Lập trình h•ớng đối t•ợng 6. Xét đoạn ch•ơng trình sau: ofstream myFile(“abc.txt”, ios::out); if(myFile) myFile << “abc.txt”; Ch•ơng trình sẽ làm gì? a. Ghi ra màn hình dòng chữ “abc.txt” b. Ghi vào tệp tin abc.txt dòng chữ “abc.txt” c. Đọc từ tệp tin abc.txt dòng chữ “abc.txt” d. Ch•ơng trình sẽ báo lỗi. 7. Xét đoạn ch•ơng trình sau: ifstream myFile(“abc.txt”, ios::in); char text[20]; if(myFile) myFile >> text; Ch•ơng trình sẽ làm gì, nếu tệp tin abc.txt có nội dung là dòng chữ “abc.txt”? a. Ghi ra màn hình dòng chữ “abc.txt” b. Ghi vào tệp tin abc.txt dòng chữ “abc.txt” c. Đọc từ tệp tin abc.txt dòng chữ “abc.txt” d. Ch•ơng trình sẽ báo lỗi. 8. Xét đoạn ch•ơng trình sau: fstream myFile(“abc.txt”, ios::out); if(myFile) myFile << “abc.txt”; myFile.close(); myFile.open(“abc.txt”, ios::in); char text[20]; if(myFile) myFile >> text; cout << text; Ch•ơng trình sẽ làm gì, nếu tệp tin abc.txt có nội dung là dòng chữ “abc.txt”? a. Ghi vào tệp tin abc.txt dòng chữ “abc.txt” b. Đọc từ tệp tin abc.txt dòng chữ “abc.txt” c. Ghi ra màn hình dòng chữ “abc.txt” d. Cả ba đáp án trên. e. Ch•ơng trình sẽ báo lỗi. 9. Xét đoạn ch•ơng trình sau: ifstream myFile(“abc.txt”, ios::in); Trang - 245 - Lập trình h•ớng đối t•ợng if(myFile) cout << myFile.tellg(); Ch•ơng trình sẽ in ra màn hình kết quả gì? a. 0 b. 1 c. 8 d. 16 10. Xét đoạn ch•ơng trình sau, nếu tệp abc.txt chứa một số l•ợng kí tự đủ lớn: ifstream myFile(“abc.txt”, ios::in); if(myFile){ char c; myFile >> c; cout << myFile.tellg();} Ch•ơng trình sẽ in ra màn hình kết quả gì? a. 0 b. 1 c. 8 d. 16 11. Xét đoạn ch•ơng trình sau, nếu tệp abc.txt chứa một số l•ợng kí tự đủ lớn: ifstream myFile(“abc.txt”, ios::in); if(myFile){ myFile.seekg(sizeof(char)*5, ios::beg); myFile.seekg(sizeof(char)*5, ios::cur); cout << myFile.tellg();} Ch•ơng trình sẽ in ra màn hình kết quả gì? a. 0 b. 5 c. 10 d. 80 12. Viết một ch•ơng trình gộp nội dung của hai tệp tin có sẵn vào một tệp tin thứ ba. Tên các tệp tin đ•ợc nhập vào từ bàn phím. 13. Viết một ch•ơng trình tìm kiếm trên tệp nhị phân có cấu trúc đ•ợc tạo bởi ví dụ 5.8. Tìm tất cả các nhân viên có tên là X, X đ•ợc nhập từ bàn phím. Hiển thị kết quả là tất cả các thông tin về các nhân viên đ•ợc tìm thấy. Trang - 246 - Lập trình h•ớng đối t•ợng 14. Viết một ch•ơng trình tìm kiếm trên tệp nhị phân có cấu trúc đ•ợc tạo bởi ví dụ 5.8. Tìm tất cả các nhân viên có năm sinh là X, X đ•ợc nhập từ bàn phím. Hiển thị kết quả là tất cả các thông tin về các nhân viên đ•ợc tìm thấy. 15. Viết một ch•ơng trình tìm kiếm trên tệp nhị phân có cấu trúc đ•ợc tạo bởi ví dụ 5.8. Tìm tất cả các nhân viên có l•ơng cao hơn hoặc bằng một giá trị X, X đ•ợc nhập từ bàn phím. Hiển thị kết quả là tất cả các thông tin về các nhân viên đ•ợc tìm thấy. 16. Viết một ch•ơng trình sao chép một đoạn đầu nội dung của một tệp tin vào một tệp tin thứ hai. Tên các tệp tin và độ dài đoạn nội dung cần sao chép đ•ợc nhập từ bàn phím. 17. Viết một ch•ơng trình sao chép một đoạn cuối nội dung của một tệp tin vào một tệp tin thứ hai. Tên các tệp tin và độ dài đoạn nội dung cần sao chép đ•ợc nhập từ bàn phím Trang - 247 - Lập trình h•ớng đối t•ợng Một số thông báo lỗi th•ờng gặp Thông báo lỗi ý nghĩa ( expected Thiếu ( ) expected Thiếu ) , expected Thiếu , < expected Thiếu < { expected Thiếu { } expected Thiếu } : expected after private Thiếu dấu : sau từ khoá private : expected after protected Thiếu dấu : sau từ khoá protected : expected after public Thiếu dấu : sau từ khoá public Array bounds missing ] Khai báo mảng thiếu ] Array must have at least one element Mảng phải có ít nhất một phần tử Array size too large Kích th•ớc mảng quá lớn Bad define directive syntax Sai cú pháp sử dụng define Bad file name format in include Tên file trong khai báo bao hàm tệp directive include sai Call of nonfunction Lời gọi hàm sai Cannot overload 'main' Có nhiều hơn 1 hàm main trong ch•ơng trình Case outside of switch Sử dụng case ngoài toán tử switch Case statement missing : Câu lệnh case thiếu : Class member 'member' declared Hàm thành phần khai báo bên ngoài outside its class lớp Compound statement missing } Câu lệnh ghép thiếu } Constructor cannot be declared 'const' or Hàm tạo không thể sử dụng khai báo Trang - 248 - Lập trình h•ớng đối t•ợng 'volatile' const hoặc volatile Constructor cannot have a return type Hàm tạo không thể trả về giá trị specification Could not find file 'filename' Không tìm thấy file Declaration is not allowed here Khai báo đặt sai vị trí Declaration missing ; Khai báo thiếu ; Declaration syntax error Câu lệnh khai báo sai cú pháp Declaration terminated incorrectly Khai báo sai (thừa dấu ; ở dòng tiêu đề của hàm) Default outside of switch Sử dụng default bên ngoài switch Division by zero Lỗi chia cho 0 do statement must have while Câu lệnh do thiếu while do-while statement missing ( Câu lệnh do - while thiếu ( do-while statement missing ) Câu lệnh do - while thiếu ) do-while statement missing ; Câu lệnh do - while thiếu ; Duplicate case Sử dụng trùng case Enum syntax error Lỗi cú pháp câu lệnh enum Expression expected Thiếu biểu thức Expression syntax Biểu thức sai cú pháp File name too long Tên file quá dài For statement missing ( Câu lênh for thiếu ( For statement missing ) Câu lênh for thiếu ) For statement missing ; Câu lênh for thiếu ; Function call missing ) Lời gọi hàm thiếu ) Goto statement missing label Câu lệnh goto thiếu nhãn Identifier expected Ch•a khai báo Trang - 249 - Lập trình h•ớng đối t•ợng If statement missing ( Câu lênh if thiếu ( If statement missing ) Câu lênh if thiếu ) Illegal initialization Khởi tạo không hợp lệ Illegal use of floating point Sử dụng dấu phẩy động không hợp lệ Illegal use of pointer Sử dụng con trỏ không hợp lệ Lvalue required Sử dụng sai toán tử quan hệ Misplaced break Sử dụng break sai vị trí Misplaced continue Sử dụng continue sai vị trí Misplaced else Sử dụng else sai vị trí operator -> must return a pointer or a toán tử -> phải trả về một con trỏ class hoặc một lớp operator [] missing ] toán tử [] thiếu ] operator delete must return void toán tử delete phải trả về void Operator must be declared as function toán tử phải đ•ợc khai báo nh• hàm Operators may not have default toán tử có thể không có đối có giá trị argument values ngầm định 'operator' must be declared with one or toán tử phải đ•ợc khai báo với một no parameters tham số hoặc không có tham số 'operator' must be declared with one or toán tử phải đ•ợc khai báo với một two parameters tham số hoặc hai tham số Pointer to structure required on left side Bên trái của -> hoặc ->* phải là con of -> or ->* trỏ cấu trúc Statement missing ; Câu lệnh thiếu ; Structure required on left side of . or .* Bên trái của . hoặc .* phải là biến cấu trúc Structure size too large Kích th•ớc của kiểu cấu trúc quá lớn Switch statement missing ( Câu lênh switch thiếu ( Trang - 250 - Lập trình h•ớng đối t•ợng Switch statement missing ) Câu lênh switch thiếu ) Too few parameters in call Quá nhiều tham số trong lời gọi Too few parameters in call to function Quá nhiều tham số trong lời gọi hàm Unexpected } Thừa } While statement missing ( Câu lệnh while thiếu ( While statement missing ) Câu lệnh while thiếu ) Abnormal program termination Ngắt ch•ơng trình một cách bất th•ờng Divide error Lỗi trong phép chia Null pointer assignment Gán con trỏ NULL Stack overflow Tràn Stack Command arguments too long Đối dòng lệnh quá dài Command syntax error Lỗi cú pháp của câu lệnh Command too long Câu lệnh quá dài Expression syntax error in !if statement Lỗi cú pháp trong biểu thức của câu lệnh if File name too long Tên file quá dài If statement too long Câu lệnh if quá dài Illegal character in constant expression Sử dụng ký tự trong biểu thức không 'expression' hợp lệ int and string types compared So sanh số nguyên và xâu ký tự No closing quote Thiếu dấu " No file name ending Thiếu dấu kết thúc tên file Unable to open include file 'filename' Không mở đ•ợc tệp bao hàm (Có thể sai đ•ờng dẫn) Unexpected end of file Thiếu dấu kết thúc ch•ơng trình } Trang - 251 - Lập trình h•ớng đối t•ợng Unknown preprocessor statement Không hiểu câu lệnh tiền xử lý Unable to open file 'filename' Không mở đ•ợc file (Có thể sai đ•ờng dẫn) Unable to open 'dpmimem.dll' Không mở đ•ợc file dpmimem.dll Write failed, disk full? Lỗi ghi đĩa, có thể đĩa bị đầy Terminated by user Bị ngắt bởi ng•ời sử dụng Switch statement missing ( Câu lệnh switch thiếu dấu ( Switch statement missing ) Câu lệnh switch thiếu dấu ) Template argument must be a constant Tham số sử dụng trong khuôn hình expression phải là một biểu thức hằng Templates must be classes or functions Khuôn hình phải là các lớp hoặc các hàm The constructor 'constructor' is not Hàm tạo không hợp lệ allowed The value for 'identifier' is not within Giá trị của biến nằm ngoài tập giá trị the range of an int của kiểu int 'this' can only be used within a member Con trỏ this chỉ đ•ợc sử dụng trong function các hàm thành phần (ph•ơng thức) Too few arguments in template class Có quá nhiều tham số trong tên của name 'template' khuôn hình lớp Too few parameters in call Có quá nhiều tham số trong lời gọi Use . or -> to call function Sử dụng dấu . hoặc dấu -> để gọi hàm Use . or -> to call 'member', or & to take Sử dụng dấu . hoặc dấu -> để lấy giá its address trị hoặc sử dụng dấu & để lấy địa chỉ Use :: to take the address of a member Sử dụng toán tử phạm vi :: để xác function định hàm thành phần của lớp Trang - 252 - Lập trình h•ớng đối t•ợng Tài liệu tham khảo 1. Ali Bahrami, “Object-oriented Systems Development”, McGraw-Hill Companies Inc., 1999. 2. Bruce Eckel, “Thinking in C++”, Prentice Hall Inc., 2000. 3. Budd, Timothy, “An Introduction to Object-Oriented Programming”, Addison- Wesley, 1997. 4. Robert Lafore, “Object-oriented Programming in C++”, SAMS, 2001. 5. Scott Robert Ladd, “C++ Kỹ Thuật và ứng Dụng”, Khoa Học Kỹ Thuật, 1992. 6. Sharam Hekmat, “C++ Programming”, Pragmatix Software Pt, 2004. 7. Phạm Văn Ất. C++ và lập trỡnh hướng đối tượng. Nhà xuất bản khoa học kỹ thuật. 2000. 8. Trần Văn Lăng. Lập trỡnh hướng đối tượng C++. Nhà xuất bản thống kờ. 1997. 9. Lờ Đăng Hưng, Tạ Tuấn Anh, Nguyễn Hữu Đức, Nguyễn Thanh Thuỷ. C++ và lập trỡnh hướng đối tượng với C++. Nhà xuất bản khoa học kỹ thuật. 1999. 10. Ngụ Trung Việt. Ngụn ngữ lập trỡnh C++. Nhà xuất bản giao thụng vận tải. 1999. 11. PGS.TS Trần Đỡnh Quế, KS. Nguyễn Mạnh Hựng. Ngụn ngữ lập trỡnh C++. Học viện bưu chớnh viễn thụng. 2006. Trang - 253 -
File đính kèm:
- giao_trinh_lap_trinh_huong_doi_tuong_phan_2.pdf