Tính kế thừa trong C++
Một trong những khái niệm quan trọng nhất trong lập trình hướng đối tượng là Tính kế thừa (Inheritance) . Tính kế thừa cho phép chúng ta định nghĩa một lớp trong điều kiện một lớp khác, mà làm cho nó dễ dàng hơn để tạo và duy trì một ứng dụng. Điều này cũng cung cấp một cơ hội để tái ...
Một trong những khái niệm quan trọng nhất trong lập trình hướng đối tượng là Tính kế thừa (Inheritance). Tính kế thừa cho phép chúng ta định nghĩa một lớp trong điều kiện một lớp khác, mà làm cho nó dễ dàng hơn để tạo và duy trì một ứng dụng. Điều này cũng cung cấp một cơ hội để tái sử dụng tính năng code và thời gian thực thi nhanh hơn.
Khi tạo một lớp, thay vì viết toàn bộ các thành viên dữ liệu và các hàm thành viên mới, lập trình viên có thể nên kế thừa các thành viên của một lớp đang tồn tại. Lớp đang tồn tại này được gọi là Base Class - lớp cơ sở, và lớp mới được xem như là Derived Class – lớp thừa kế.
Ý tưởng của tính kế thừa triển khai mối quan hệ IS A (Là Một). Ví dụ: mammal IS-A animal, dog IS-A mammal, vì thế dog IS-A animal và ....
Lớp cơ sở (Base Class) và Lớp thừa kế (Derived Class) trong C++
Một lớp có thể được kế thừa từ hơn một lớp khác, nghĩa là, nó có thể kế thừa dữ liệu và hàm từ nhiều lớp cơ sở. Để định nghĩa một lớp kế thừa (Derived Class), chúng ta sử dụng một danh sách để xác định các lớp cơ sở. Danh sách này liệt kê một hoặc nhiều lớp cơ sở và có form sau:
class lop_ke_thua: access_modifier lop_co_so
Ở đây, access_modifier là public, protected hoặc private, và lop_co_so là tên của lớp đã được định nghĩa trước đó. Nếu access_modifier không được sử dụng, thì mặc định là private.
Bạn xem xét ví dụ sau với Hinh là lớp cơ sở và HinhChuNhat là lớp kế thừa:
#include <iostream> using namespace std; // lop co so: Hinh class Hinh { public: void setChieuRong(int rong) { chieurong = rong; } void setChieuCao(int cao) { chieucao = cao; } protected: int chieurong; int chieucao; }; // day la lop ke thua: HinhChuNhat class HinhChuNhat: public Hinh { public: int tinhDienTich() { return chieurong * chieucao; } }; int main(void) { HinhChuNhat Hcn; Hcn.setChieuRong(14); Hcn.setChieuCao(30); // in dien tich cua doi tuong. cout << "Tong dien tich la: " << Hcn.tinhDienTich() << endl; return 0; }
Biên dịch và chạy chương trình C++ trên sẽ cho kết quả sau:
Điều khiển truy cập và
Một lớp kế thừa có thể truy cập tất cả thành viên không phải là private của lớp cơ sở của nó. Vì thế, các thành viên lớp cơ sở, mà là hạn chế truy cập tới các hàm thành viên của lớp kế thừa, nên được khai báo là private trong lớp cơ sở.
Chúng ta tổng kết các kiểu truy cập khác nhau, tương ứng với ai đó có thể truy cập chúng như sau:
Truy cập | public | protected | private |
---|---|---|---|
Trong cùng lớp | Có | Có | Có |
Lớp kế thừa | Có | Có | Không |
Bên ngoài lớp | Có | Không | Không |
Một lớp kế thừa (Derived Class) sẽ kế thừa tất cả các phương thức của lớp cơ sở, ngoại trừ:
Constructor, destructor và copy constructor của lớp cơ sở.
Overloaded operator (toán tử nạp chồng) của lớp cơ sở.
Hàm friend của lớp cơ sở.
Kiểu kế thừa trong C++
Khi kế thừa từ một lớp cơ sở, lớp cơ sở đó có thể được kế thừa thông qua kiểu kế thừa là public, protected hoặc private. Kiểu kế thừa trong C++ được xác định bởi Access-specifier đã được giải thíc ở trên.
Chúng ta hiếm khi sử dụng kiểu kế thừa protected hoặc private, nhưng kiểu kế thừa public thì được sử dụng phổ biến hơn. Trong khi sử dụng các kiểu kế thừa khác sau, bạn nên ghi nhớ các quy tắc sau:
Kiểu kế thừa Public: Khi kế thừa từ một lớp cơ sở là public, thì các thành viên public của lớp cơ sở trở thành các thành viên public của lớp kế thừa; và các thành viên protected của lớp có sở trở thành các thành viên protected của lớp kế thừa. Một thành viên là private của lớp cơ sở là không bao giờ có thể được truy cập trực tiếp từ một lớp kế thừa, nhưng có thể truy cập thông qua các lời gọi tới các thành viên public và protected của lớp cơ sở đó.
Kiểu kế thừa protected: Khi kế thừa từ một lớp cơ sở là protected, thì các thành viên public và protected của lớp cơ sở trở thành các thành viên protected của lớp kế thừa
Kiểu kế thừa private: Khi kế thừa từ một lớp cơ sở là private, thì các thành viên public và protected của lớp cơ sở trở thành các thành viên private của lớp kế thừa
Đa kế thừa trong C++
Một lớp trong C++ có thể kế thừa các thành viên từ nhiều lớp, và đây là cú pháp:
class lop_ke_thua: access_modifier lop_co_so_1, access_modifier lop_co_so_2 ...
Tại đây, access_modifier là public, protected hoặc private và sẽ được cung cấp cho mỗi lớp cơ sở, và chúng sẽ được phân biệt với nhau bởi dấu phảy như trên. Bạn thử ví dụ sau:
#include <iostream> using namespace std; // lop co so: Hinh class Hinh { public: void setChieuRong(int rong) { chieurong = rong; } void setChieuCao(int cao) { chieucao = cao; } protected: int chieurong; int chieucao; }; // lop co so: ChiPhiSonMau class ChiPhiSonMau { public: int tinhChiPhi(int dientich) { return dientich * 300000; } }; // day la lop ke thua: HinhChuNhat class HinhChuNhat: public Hinh, public ChiPhiSonMau { public: int tinhDienTich() { return chieurong * chieucao; } }; int main(void) { HinhChuNhat Hcn; int dientich; Hcn.setChieuRong(14); Hcn.setChieuCao(30); dientich = Hcn.tinhDienTich(); // in dien tich cua doi tuong. cout << "Tong dien tich la: " << Hcn.tinhDienTich() << " m2." << endl; // in tong chi phi de son mau cout << "Tong chi phi de son mau la: " << Hcn.tinhChiPhi(dientich) << " VND." << endl; return 0; }
Biên dịch và chạy chương trình C++ trên sẽ cho kết quả sau:
Mọi người cho thể tham gia khóa học thứ 6 của vietjackteam (đang tuyển sinh) vào đầu tháng 03/2018 do anh Nguyễn Thanh Tuyền, admin vietjack.com trực tiếp giảng dạy tại Hà Nội. Chi tiết nội dung khóa học tham khỏa link : .Các bạn học CNTT, điện tử viễn thông, đa phương tiện, điện-điện tử, toán tin có thể theo học khóa này. Số lượng các công việc Java hoặc .NET luôn gấp ít nhất 3 lần Android hoặc iOS trên thị trường tuyển dụng.
Mọi người có thể xem demo nội dung khóa học tại địa chỉ
Các bạn ở xa học không có điều kiện thời gian có thể tham dự khóa Java online để chủ động cho việc học tập. Trong tháng 4/2018, VietJack khuyến mại giá SỐC chỉ còn 150k cho khóa học, liên hệ facebook admin fb.com/tuyen.vietjack để thanh toán chuyển khoản hoặc thẻ điện thoại, khóa học bằng Tiếng Việt với gần 100 video, các bạn có thể chủ động bất cứ lúc nào, và xem mãi mãi. Thông tin khóa học tại
Loạt bài hướng dẫn học lập trình C++ cơ bản và nâng cao của chúng tôi dựa trên nguồn tài liệu của: Tutorialspoint.com
Follow fanpage của team hoặc facebook cá nhân Nguyễn Thanh Tuyền để tiếp tục theo dõi các loạt bài mới nhất về Java,C,C++,Javascript,HTML,Python,Database,Mobile.... mới nhất của chúng tôi.
Bài học C++ phổ biến khác tại vietjack.com: