C++ OOP từ cơ bản đến nâng cao (Phần 4)
Xin chào các bạn, hôm nay chúng ta lại quay trở lại series lập trình C++ hướng đối tượng từ cơ bản đến nâng cao ở bài trước chúng ta đã biết đến khais niệm lớp bạn, hàm bạn rồi. Trong bài hôm nay chúng ta sẽ cùng đi tìm hiểu về kế thừa trong C++
Như các bạn đã biết là trong C++ có khoảng 5 loại kế thừa như hình vẽ dưới đây:
int main(){
SinhVien SV(1993,"binh","12345");
SV.Eat();
SV.Output()
System("pause");
return 0;
}
Như ví dụ trên thì ta viết class SinhVien kế thừa từ class Người từ đây class SinhVien có thể truy xuất các hàm trong class Người, kết quả sau khi chúng ta chạy chương trình sẽ là
Như các bạn đã biết là trong C++ có khoảng 5 loại kế thừa như hình vẽ dưới đây:
Nhưng trong khuôn khổ của bài viết này ta chỉ quan tâm đến thừa kế đơn mà thôi( Tức là con chỉ kế thừa từ một cha)
Đặc tính của kế thừa:
+Cho phép định nghĩa lớp mới từ lớp đã có
- Lớp mới gọi là lớp con (subclass) hay lớp dẫn xuất( derivedclass)
- Lớp đã gọi là lớp cha (superclass) hay lớp cơ sở(baseclass)
+ Thừa kế cho phép:
- Nhiều lớp có thể dẫn xuất từ một lớp cơ sở
- Một lớp có thể là dẫn xuất của nhiều lớp cơ sở
-=> Một cha có nhiều con
- Thừa kế không chỉ giới hạn ở một mức: Một lớp dẫn xuất có thể là lớp cơ sở cho các lớp dẫn xuất khác
=> Một lớp cha ngoài có con ra còn có cháu.
+ Cú pháp khai báo
class SuperClass{
// Thành phần của lớp cơ sở
}
class DerivedClass: public/protected/private SuperClass{
// Thành phần bổ sung của lớp dẫn xuất.
}
Chúng ta sẽ đi làm một ví dụ sau để các bạn dễ hiểu hơn nhé. Chúng ta sẽ cài đặt một ví dụ theo hình bên dưới đây
Code:
#include<stdio.h>
#include<iostream>
#include<string>
using namespace std;
class Nguoi{
int Dob;
string Name;
public:
Nguoi(){}
Nguoi(int dob, string name){
Dob=dob;
Name=name;
}
void Eat(){
cout<<Name<<" ăn 2kg Gạo một ngày"<< endl;
}
void Output(){
cout<<"Name: "<<Name<<endl;
cout<<"Date of birth: "<<Dob<<endl;
}
class SinhVien: public Nguoi{
string ID;
public:
SinhVien(){}
SinhVien(int dob, string name,string id) : Nguoi(dob,name){
ID=id;
}
void Output(){
cout<<"MSSV: "<<ID<<endl;
}
}
};
SinhVien SV(1993,"binh","12345");
SV.Eat();
SV.Output()
System("pause");
return 0;
}
Như ví dụ trên thì ta viết class SinhVien kế thừa từ class Người từ đây class SinhVien có thể truy xuất các hàm trong class Người, kết quả sau khi chúng ta chạy chương trình sẽ là
Phạm vi truy xuất
Như các bạn đã biết là khi chúng ta khai báo các thuộc tính trong một class thì chúng ta sẽ có 3 từ khóa là public, private và protected. Nếu bạn không khai báo thì chương trình sẽ tự hiểu private
Phạm vi truy xuất sẽ được biểu diễn qua hình vẽ sau
+ Qua đó có thể thấy Hàm bạn có thể truy cập tất cả các thuộc tính của lớp cơ sở
+ Lớp dẫn xuất hay lớp con chỉ có thể truy cập được các thuộc tính là public hoặc protected
+ Các lớp khác thì chỉ có thể truy cập được thuộc tính public
Ta sẽ đi cụ thể từng thuộc tính một nhé:
Thuộc tính public:
+ Thành phần nào có thuộc tính public thì có thể truy xuất từ bất cứ nơi nào
Thuộc tính private
+ Là riêng tư của lớp đó
+ Chỉ có hàm thành phần của lớp và ngoại lệ các hàm bạn được truy xuất.
+ Các lớp con cũng không có quyền truy xuất.
Thuộc tính Protected
+ Cho phép quy định một vài thành phần nào đó của lớp là bảo mật, theo nghĩa thế giới bên ngoài không được phép truy xuất nhưng tất cả các lớp con, cháu… đều được phép truy xuất.
+ Là cách để tránh phải sửa đổi lớp cơ sở khi có lớp con mới hình thành - > Đảm bảo tính đóng gói
+ Thông thường ta dung thuộc tính protected cho thành phần dữ lieu và public cho thành phần phương thức.
+ Tóm lại, thành phần có thuộc tính là protected chỉ cho phép những lớp con kế thừa được phép sử dụng




Nhận xét
Đăng nhận xét