Lập Trình C++ B12: Tính Kế Thừa Trong Lập Trình C++
Tính kế thừa trong lập trình c++
– Được coi là một trong những tính chất tiêu biểu của lập trình hướng đối tượng.
– Nó được sử dụng cực kỳ phổ biến khi triển khai các dự án phần mềm c++.
1. Vì sao phải sử dụng tính kế thừa.
– Khi mô hình hóa các đối tượng sẽ có những đối tượng có nhiều đặc điểm giống nhau về các trường thuộc tính, và các phương thức.
– Nếu không sử dụng tính kế thừa sẽ dễ gây ra hiện tượng nhiều đoạn mã code trùng nhau, lặp đi lặp lại.
– Để tối ưu hơn, thì phải tái sử dụng được các đoạn mã code, nghĩa là chỉ cần một đoạn mã code được viết ra nhưng nó có thể sử dụng cho nhiều lớp đối tượng.
– Ngoài ra các đối tượng khi mô hình hóa hoàn toàn có thể xây dựng được các mối quan hệ liên quan, như cha con.
=> Đó chính là nguyên lý cho sự kế thừa.
2. Bài toán ví dụ tính kế thừa.
Viết chương trình quản lý nhân viên một công ty, học sinh một lớp học, hay các thành viên trong một tổ chức xã hội.
a. Phân tích bài toán:
Nhân viên, học sinh, cá nhân đều là đối tượng con người có chung các thuộc tính như sau:
- Tên
- Tuổi
- Giới tính
- Số chưng minh
- Quê quán.
Sau đó là các thuôc tính riêng cho từng loại:
Nhân viên: lương, cấp bậc, chỉ số năng lực.
Học sinh: Điểm, chỉ số xếp hạng
Cá nhân tổ chức: Số năm hoạt động. thành tích hoạt động….
b. Ý tưởng thiết kế.
– Từ những thuộc tính chung ở trên, ta sẽ tạo ra một lớp đối tượng cha bao gồm các thông tin chung.
– Sau đó là các lớp con kế thừa lớp cha để sử dụng các thuộc tính chung, sau đó mỗi lớp con sẽ khai bao thêm các thuộc tính riêng của chúng.
Hãy cùng xem một lớp base mà tôi định nghĩa như sau:
class PersonInfo { public: PersonInfo() {;} ~PersonInfo(){;} void set_age(const int& age) {age_ = age;}; void set_sex(const int& sex) {sex_ = sex;}; int get_age() const {return age_;} int get_sex() const {return sex_;} void InputInfo(); protected: char name_[20]; int age_; int sex_; }; void PersonInfo::InputInfo() { std::cout << "\nInput info"; std::cout << "\nName = "; std::cin.getline(name_, 19); std::cout << "\nAge = "; std::cin >> age_; std::cout << "\nSex ="; std::cin >> sex_; }
Các bạn sẽ thấy:
Lớp cha chính là lớp PersonInfo, chứa các thuộc tính chung cho một con người.
=> Bất cứ đối tượng nào liên quan đến con người đều có thể kế thừa từ lớp cha PersonInfo.
3. Lý thuyết cơ bản tính kế thừa.
Cách khai báo một lớp kế thừa một lớp như sau:
Giả sử tôi có lớp base là lớp : PersonInfo ở trên.
Và tôi sẽ khai báo ra một lớp nhân viên có tên là StaffInfo kế thừa lớp base.
Cú pháp như sau:
[Từ khóa class] [tên lớp kế thừa] : [quyền thừa kế] [tên lớp thừa kế]
Chúng ta sẽ chỉ quan tâm đến quyền thừa kế:
Có 3 loại quyền thừa kế là : public, protected, private.
Và thông thường người ta chủ yếu sử dụng quyền public khi thừa kế.
Vậy ý nghĩa của 3 loại quyền này thế nào.
3.1. Thừa kế quyền public:
– Với Các biến thành viên public lớp cha, thì cũng là public với lớp con, nghĩa là ông con có thể gọi được các biến của ông cha.
– Các biến thành viên protected lớp cha thì cũng trở thành protected của lớp con, và lớp con cũng gọi trực tiếp được đến các biến protected lớp cha.
– Với Các biến private lớp cha thì là riêng tư của cha, ông con không được phép can thiệp trực tiếp vào (muốn can thiệp phải thông qua function dạng public hoặc protected của lớp cha.)
3.2. Kế thừa quyền protected.
Các biến public hay protected của lớp cha sẽ được coi như là biến protected của lớp con.
Đối tượng lớp con không thể trực tiếp truy xuất đến biến public của cha ở một hàm bất kỳ(vì qua ông con, biến public của cha đã trở thành protected của con).
3.3 Kế thừa quyền private.
Các biến trong lớp cha, ở mọi quyền, đều trở thành private của lớp con.
Áp dụng code sẽ như sau
class StaffInfo : public PersonInfo { public: StaffInfo(const double& hdi, const double& salary) { salary_ = salary; hdi_index_ = hdi; } StaffInfo() {;} ~StaffInfo(){;} void set_salary(const double& sal) {salary_ = sal;} void set_hdi(const double& hdi) {hdi_index_ = hdi;} double get_salary() const {return salary_;} double get_hdi() const {return hdi_index_;} void PrintInfo(); private: double salary_; double hdi_index_; }; void StaffInfo::PrintInfo() { std::cout << "Name:" << name_; std::cout << "\n Age:" << age_; std::cout << "\n Sex:" << sex_; std::cout << "\n Salary:" << salary_; std::cout << "\n hdi_index:" << hdi_index_; }
4. Khi sử dụng lớp kế thừa
+ sử dụng hàm của lớp cha đã có sẵn
+ sử dụng hàm của lớp con
void main() { double salry = 5.0; double hdi = 7.0; StaffInfo* pStaff = new StaffInfo(hdi, salry); pStaff->InputInfo(); pStaff->PrintInfo(); _getch(); return; }
Đó là lý thuyết cơ bản về tính kế thừa trong c++
End
It became famous.
yes, that’s famous feature of OOP
Known To The World V