Ta có thể định nghĩa chồng cho hai toán tử vào/ra << và >> kết hợp với cout
và cin (cout<< và cin>>), cho phép các đối tợng đứng bên phải chúng. Lúc đó ta có thể thực hiện các thao tác vào ra nh nhập dữ liệu từ bàn phím cho các đối t- ợng, hiển thị giá trị thành phần dữ liệu của các đối tợng ra màn hình. Hai hàm toán tử << và >> phải là hàm tự do và khai báo là hàm bạn của lớp.
Ví dụ 4.11 #include <iostream.h> #include <conio.h> class SO { private: int giatri; public: SO(int x=0) { giatri = x; } SO (SO &tso) { giatri = tso.giatri; }
friend istream& operator>>(istream&,SO&); friend ostream& operator<<(ostream&,SO&); };
void main(){ clrscr(); SO so1,so2;
cout<<"Nhap du lieu cho so1 va so2 " << endl; cin>>so1;
cin>>so2;
cout<<"Gia tri so1 la : " <<so1 <<" so 2 la : "<<so2<<endl; getch();
}
istream& operator>>(istream& nhap,SO& so) {
cout << "Nhap gia tri so :"; nhap>> so.giatri;
return nhap; }
ostream& operator<<(ostream& xuat,SO& so) {
xuat<< so.giatri; return xuat;
Bài tập
1. Định nghĩa các phép toán tải bội =, ==, ++, --, +=, <<, >> trên lớp Time (bài tập 1 chơng 3).
2. Định nghĩa các phép toán tải bội =, ==, ++, --, +=, <<, >> trên lớp Date (bài tập 2 chơng 3).
3. Định nghĩa các phép toán tải bội +, -, *, =, ==, != trên lớp các ma trận vuông. 4. Định nghĩa các phép toán tải bội +, -, * trên lớp đa thức.
5. Định nghĩa các phép toán tải bội +, -, *, /, =, ==, +=, -=, *=, /= , <, >, <=, >=, != , ++, -- trên lớp Phanso (bài tập 11 chơng 3).
6. Ma trận đợc xem là một vectơ mà mỗi thành phần của nó là một vectơ. Theo nghĩa đó, hãy định nghĩa lớp Matran dựa trên vectơ. Tìm cách để chơng trình dịch hiểu đợc phép truy nhập m[i][j], trong đó m là một đối tợng thuộc lớp
Chơng 5
kế thừa
Chơng 5 trình bày các vấn đề sau:
Đơn kế thừa, đa kế thừa
Hàm tạo và hàm hủy đối với sự kế thừa
Hàm ảo, lớp cơ sở ảo
5.1. Giới thiệu
Kế thừa là một trong các khái niệm cơ sở của phơng pháp lập trình hớng đối tợng. Tính kế thừa cho phép định nghĩa các lớp mới từ các lớp đã có. Một lớp có thể là lớp cơ sở cho nhiều lớp dẫn xuất khác nhau. Lớp dẫn xuất sẽ kế thừa một số thành phần (dữ liệu và hàm) của lớp cơ sở, đồng thời có thêm những thành phần mới. Có hai loại kế thừa là: đơn kế thừa và đa kế thừa, có thể minh họa qua các hình vẽ sau đây:
Hình 5.1. Đơn kế thừa, lớp A là lớp cơ sở của lớp B
(a) (b) (c) Hình 5.2. Đa kế thừa
Hình (a): Lớp A là lớp cơ sở của lớp B, lớp B là lớp cơ sở của lớp C Hình (b): Lớp A là lớp cơ sở của các lớp B, C, D
Hình (c): Lớp A, B, C là lớp cơ sở của lớp D
5.2. Đơn kế thừa