vi du ve tinh ke thua

Lần này, tôi van quy tắc được reviews thêm một định nghĩa nền tảng của lập trình sẵn phía đối tượng người sử dụng, cùng theo với tính gói gọn nhưng mà chúng ta đang được dò la hiểu nhập bài xích trước, đấy là tính tiếp thừa (inheritance). Đây hoàn toàn có thể xem như là 1 phần tử không thể không có tạo ra sức khỏe của OOP.

Bạn đang xem: vi du ve tinh ke thua

Trong bài học kinh nghiệm này, tôi tiếp tục quay trở về với ví dụ của lớp NhanVat, tuy nhiên được giản lược cút nhiều nhằm tất cả chúng ta hoàn toàn có thể triệu tập nhập trung tâm.

Thế tuy nhiên, chúng ta cũng chớ vượt lên trên lo ngại vì thế định nghĩa này sẽ không hề vượt lên trên khó khăn hiểu cho dù quyền lợi nhưng mà nó đưa đến cho tới tất cả chúng ta vô nằm trong to tát rộng lớn.

Ví dụ về tính chất tiếp thừa

Nhiều người tiếp tục thấy kỳ lạ khi nghe tới về sự việc thừa kế ở nhập lập trình sẵn tin yêu học tập tuy nhiên thiệt sự thì định nghĩa này không thực sự phiền nhiễu. Đấy vốn liếng là nghệ thuật được cho phép những lập trình sẵn viên dẫn đến 1 lớp dựa vào 1 lớp không giống đã có sẵn. Lớp ban sơ tiếp tục phát triển thành nền tảng của lớp mới mẻ nhưng mà tất cả chúng ta ham muốn dẫn đến. Kỹ thuật này tiếp tục được cho phép tất cả chúng ta ko cần thiết ghi chép lại rất nhiều lần đoạn mã xử lý triển khai nằm trong 1 việc làm.

Làm sao nhận ra sự tiếp thừa ?

Câu chất vấn hoặc được đưa ra là « Trong OOP thì làm thế nào để hiểu khi này thì nên cần dùng tính tiếp thừa ? ». hầu hết người từng thống khổ vì thế định nghĩa này thì trông thấy nó ở từng tất cả điểm. Một số người không giống, phần nhiều là những tân binh mới mẻ học tập lập trình sẵn, thì từng chuyến luôn luôn nên tự động bịa lại thắc mắc. Thế tuy nhiên tôi tiếp tục cho tới chúng ta 1 tuyệt kỹ nhằm hoàn toàn có thể nhận ra khi này cần thiết tới sự thừa kế nhập lập trình sẵn phía đối tượng người sử dụng. Nó đặc biệt đơn giản và giản dị và khôn cùng đúng mực.

Các chúng ta biết là cần dùng tới sự thừa kế nếu như tất cả chúng ta hoàn toàn có thể khẳng định : A là B.

Tôi suy nghĩ là 1 trong những ví dụ rõ ràng rộng lớn tiếp tục đặc biệt hữu ích. Trò đùa của tất cả chúng ta sở hữu thật nhiều loại nhân vật : binh lực, phù thủy, mến khách hàng, vv… Rất phong phú và đa dạng với những Điểm lưu ý không giống nhau, tuy nhiên bọn chúng đều là những anh hùng. Tôi nói cách khác « chiến binh là 1 trong những nhân vật » hoặc « phù thủy là 1 trong những nhân vật ». Vậy nên nếu như tất cả chúng ta dẫn đến 2 lớp ChienBinhPhuThuy thì cả hai lớp này tiếp tục đều thừa kế lớp NhanVat nhưng mà tất cả chúng ta đang được dẫn đến trước cơ.

Sau đấy là 1 số ít ví dụ không giống hoặc được dùng nhằm tế bào miêu tả tính tiếp thừa :

  • Xe máy là 1 trong những loại phương tiện đi lại nên lớp XeMay thừa kế lớp PhuongTien.
  • Xe giẫm là 1 trong những loại phương tiện đi lại nên lớp XeDap thừa kế lớp PhuongTien.
  • Khủng long bạo chúa là 1 trong những loại khủng long thời tiền sử nên lớp KhungLongBaoChua thừa kế lớp KhungLong.
  • Khủng long là 1 trong những loại động vật hoang dã nên lớp KhungLong thừa kế lớp DongVat.

Ngược lại, tất cả chúng ta sẽ không còn thể phát biểu « xe máy là 1 trong những loại động vật » thế cho nên tiếp tục không tồn tại sự thừa kế này ở phía trên cả.

! Hãy đặc biệt xem xét tôn nhập quy tắc bên trên còn nếu như không chúng ta sở hữu nguy cơ tiềm ẩn phát hiện những yếu tố rộng lớn về logic trong khúc mã mối cung cấp.

Trong phần tiếp theo sau, tất cả chúng ta tiếp tục coi cơ hội triển khai sự thừa kế nhập C++ qua loa lớp NhanVat.

Lớp NhanVat

Nhắc lại 1 chút thì đấy là lớp tế bào miêu tả 1 anh hùng nhập siêu cấp cho trò đùa RPG của tất cả chúng ta. Các chúng ta ko cần phải biết đùa nhằm hoàn toàn có thể bám theo dõi tiếp ví dụ. Cá nhân tôi thấy nó nâng khô ráo rất nhiều đối với những ví dụ vẫn hoặc được dùng bởi vì những thấy dạy dỗ lập trình sẵn ở ngôi trường.

Tôi tiếp tục đơn giản và giản dị hóa 1 chút lớp NhanVat nhưng mà tất cả chúng ta đang được dẫn đến ở bài xích trước.

#ifndef DEF_NHANVAT #define DEF_NHANVAT #include <iostream> #include <string> class NhanVat{    public:        NhanVat();        void nhanSatThuong(int dmg);        void tanCong(NhanVat &mucTieu) const;    private:        int m_hp;        std::string m_ten; }; #endif

Nhân vật của tất cả chúng ta tiếp tục có một cái thương hiệu và 1 số ít điểm hp. Chúng tớ chỉ dùng 1 công thức khởi tạo ra đem quyết định được cho phép người đùa gọi là cho tới anh hùng và chính thức với 100 điểm hp.

Nhân vật hoàn toàn có thể Chịu sát thương trải qua công thức nhanSatThuong và dẫn đến sát thương cho tới anh hùng không giống qua loa công thức tanCong.

Dưới đấy là ví dụ 1 đoạn mã xử lý ở trong tệp NhanVat.cpp.

#include "NhanVat.h" using namespace std; NhanVat::NhanVat() : m_hp(100), m_ten("BuBu"){ } void NhanVat::nhanSatThuong(int dmg){    m_hp -= dmg; } void NhanVat::tanCong(NhanVat &mucTieu) const{    mucTieu.nhanSatThuong(10); }

Những kỹ năng và kiến thức bên trên phía trên tất cả chúng ta đều từng thảo luận qua loa.

Lớp ChienBinh thừa kế lớp NhanVat

Sau phía trên được xem là tiết mục chủ yếu : tất cả chúng ta ham muốn dẫn đến 1 lớp con cái của lớp NhanVat. Nói cách tiếp theo, lớp mới mẻ này tiếp tục thừa kế lớp NhanVat.

Tôi sẽ khởi tạo đi ra 1 lớp ChienBinh nhằm tế bào miêu tả những anh hùng binh lực. Định nghĩa lớp này nhập tệp ChienBinh.h tiếp tục như sau :

#ifndef DEF_CHIENBINH #define DEF_CHIENBINH #include <iostream> #include <string> #include "NhanVat.h" //Dung thân quen them NhanVat.h neu ban muon ke thua thiệt lop NhanVat class ChienBinh : public NhanVat{ //Y nghia cua dong tren la lop ChienBinh ke thua thiệt lop NhanVat }; #endif

Dựa bám theo đoạn mã bên trên thì cơ lớp ChienBinh tiếp tục chiếm hữu toàn bộ những tính chất na ná công thức của lớp NhanVat.

Trong tình huống đấy thì tất cả chúng ta tiếp tục gọi lớp NhanVat là « lớp mẹ » còn lớp ChienBinh là « lớp con ».

? Tạo đi ra thêm một lớp chứa chấp với mọi tính chất và công thức thì sở hữu quyền lợi gì ?

Lợi ích là tất cả chúng ta hoàn toàn có thể thêm thắt những tính chất và công thức quan trọng chỉ mất ở những anh hùng binh lực nhập lớp ChienBinh. Ví dụ như tôi tiếp tục thêm vô phía trên công thức tanCongLienTiepBangRiu.

#ifndef DEF_CHIENBINH #define DEF_CHIENBINH #include <iostream> #include <string> #include "NhanVat.h" //Dung thân quen them NhanVat.h neu ban muon ke thua thiệt lop NhanVat class ChienBinh : public NhanVat{ public:    void tanCongLienTiepBangRiu() const; }; #endif

Chúng tớ sẽ sở hữu sơ vật dụng sau :

Ý nghĩa của sơ vật dụng là : lớp ChienBinh thừa kế lớp NhanVat nên chiếm hữu toàn bộ đặc điểm của lớp này (có tính chất thương hiệu, số điểm hp và sở hữu công thức nhận sát thương). Chúng tớ bảo rằng lớp ChienBinh được thường xuyên biệt hóa kể từ lớp NhanVat. Trong khi nó chiếm hữu thêm một công thức của riêng rẽ bản thân là tanCongLienTiepBangRiu().

! Cần xem xét là nhập quy tắc thừa kế thì lớp con cái tiếp tục thừa kế toàn bộ, tức thị cả công thức lẫn lộn tính chất của lớp u.

Các chúng ta đang được chính thức tưởng tượng đi ra rồi chứ ? Trong C++, nếu như 2 đối tượng người sử dụng hoàn toàn có thể được biểu diễn miêu tả bám theo mối quan hệ « đối tượng này là đối tượng người sử dụng kia » thì tất cả chúng ta tiếp tục dùng cho tới tính thừa kế. Đối tượng ChienBinh hoàn toàn có thể được xem như là 1 tăng cấp của đối tượng người sử dụng NhanVat với những công dụng mới mẻ thêm vô.

Khái niệm này tưởng bọn chúng như đơn giản và giản dị tuy nhiên tiếp tục trở thành vô nằm trong uy lực khi chúng ta đang được hiểu rõ sâu xa nó. Chúng tớ sẽ sở hữu nhiều thời cơ nhằm thực hành thực tế với nó nhập phần tiếp theo sau của giáo trình.

Lớp PhuThuy cũng thừa kế lớp NhanVat

1 sự thừa kế thì ko đưa đến nhiều khác lạ tuy nhiên khi nhưng mà nhiều sự thừa kế được dùng kết phù hợp với nhau thì sức khỏe của định nghĩa này từ từ thể sinh ra.

Tiếp bám theo tất cả chúng ta sẽ khởi tạo đi ra lớp PhuThuy cũng thừa kế lớp NhanVat, cũng chính vì 1 phù thủy cũng là 1 trong những anh hùng. Vậy nên 1 phù thủy cũng tiếp tục mang tên và số điểm hp nằm trong về tay na ná hoàn toàn có thể dùng quy tắc tiến công đơn giản và giản dị.

Khác biệt là 1 phù thủy còn nên triển khai được phép màu như tạo ra phun đi ra băng hoặc lửa, vv… Để dùng những quy tắc này thì phù thủy cần thiết tiêu hao điểm mana (1 tính chất mới mẻ nhưng mà tất cả chúng ta cần thiết thêm thắt vào). Khi này điểm mana quay trở lại 0 thì phù thủy sẽ không còn thể thực hiện quy tắc nữa.

#ifndef DEF_PHUTHUY #define DEF_PHUTHUY #include <iostream> #include <string> #include "NhanVat.h" class PhuThuy : public NhanVat{    public:        void phunLua();        void phunBang();    private:        int m_mp; }; #endif

Điều cần thiết là chúng ta cần thiết làm rõ nguyên tắc hoạt động và sinh hoạt của sự việc thừa kế.

Trong sơ vật dụng bên trên thì tôi ko phát biểu cho tới những tính chất tuy nhiên bọn chúng cũng vẫn được thừa kế ko không giống gì những công thức.

Và thậm chí là còn ảo diệu rộng lớn là tất cả chúng ta hoàn toàn có thể dẫn đến 1 lớp con cái thừa kế 1 lớp u nhưng mà bạn dạng thân mật lớp u này cũng chính là lớp con cái của một tấm khác! Hãy tưởng tượng là tất cả chúng ta sẽ sở hữu 2 loại phù thủy : phù thủy đen giòn thường xuyên tiến công và phù thủy Trắng thường xuyên trị thương. Mọi loại tiếp tục trở thành thiệt thú vị.

Chúng tớ hoàn toàn có thể cứ kế tiếp mãi như thế…

Các các bạn sẽ thấy là nhập tủ sách Qt nhưng mà tất cả chúng ta dò la hiểu ở chương sau hoàn toàn có thể xuất hiện tại cho tới 5, 6 sự thừa kế ông chồng lên nhau là thông thường. Đừng vội vàng, rồi những các bạn sẽ thấy nhiều hơn!

Dẫn xuất loại dữ liệu

Chúng tớ hãy kiểm tra đoạn mã sau đây:

NhanVat nhanVat; ChienBinh chienBinh; nhanVat.tanCong(chienBinh); chienBinh. tanCong(nhanVat);

Đoạn mã bên trên hoạt động và sinh hoạt đảm bảo chất lượng. Thế tuy nhiên nếu như chúng ta Chịu xem xét kỹ, nhiều các bạn sẽ vướng mắc là làm công việc thế này nhưng mà đoạn mã xử lý bên trên hoàn toàn có thể chạy được cũng chính vì bám theo những gì tất cả chúng ta đang được thảo luận qua loa, đoạn mã bên trên tiếp tục nên báo lỗi.

Nếu vẫn còn tồn tại chúng ta không tuân theo kịp thì yếu tố của tất cả chúng ta như vậy này : hãy coi nguyên vẹn khuôn mẫu của công thức tanCong.

void tanCong(NhanVat &mucTieu) const;

Phương thức này là như là nhau cho dù là nhập lớp NhanVat hoặc lớp ChienBinh cũng chính vì ChienBinh đang được thừa kế kể từ NhanVat.

Khi tất cả chúng ta triển khai chienBinh.tanCong(nhanVat);, thông số của tất cả chúng ta là 1 trong những đối tượng người sử dụng NhanVat quả thật nguyên vẹn khuôn mẫu.

Thế tuy nhiên trong câu mệnh lệnh nhanVat.tanCong(chienBinh);, tất cả chúng ta lại truyền 1 thông số ChienBinh cho tới công thức này. Vậy thực hiện thế quái ác này nhưng mà trình biên dịch ko trả về cho tới tất cả chúng ta 1 thông tin lỗi như thông thường lệ? Nó thậm chí là vẫn biên dịch đi ra được một đoạn mã máy hoạt động và sinh hoạt một cách thông thường !

Thật đi ra thì kín của điều ảo diệu này cho tới từ là 1 Điểm lưu ý của tính thừa kế nhập C++ : nó cho quy tắc tất cả chúng ta 1 đối tượng người sử dụng của lớp con cái thay cho thế đối tượng người sử dụng của lớp u nhập bất kể xử lý này sở hữu tương quan cho tới con cái trỏ hoặc tham lam chiếu bên trên lớp mẹ.

Điều này tức thị tất cả chúng ta trọn vẹn sở hữu quyền ghi chép 1 đoạn mã như sau :

NhanVat *nhanVat(0); ChienBinh *chienBinh = new ChienBinh(); nhanVat = chienBinh; // Qua than vãn ky roi !!!

2 dòng sản phẩm mệnh lệnh thứ nhất trọn vẹn không tồn tại gì quan trọng. Chúng tớ chỉ giản đơn là dẫn đến 1 con cái trỏ lên loại NhanVat rồi gán cho tới nó độ quý hiếm là 0 và khởi tạo ra 1 con cái trỏ không giống lên đối tượng người sử dụng loại ChienBinh.

Thế tuy nhiên dòng sản phẩm mệnh lệnh cuối thì khá kỳ kỳ lạ vì thế tất cả chúng ta đang được gán lộn lạo thân mật con cái trỏ lên 2 loại tài liệu không giống nhau.

Nếu trong mỗi tình huống không giống thì trình biên dịch tiếp tục vô nằm trong ko ưng ý và ko được cho phép tất cả chúng ta triển khai điều này. Thế tuy nhiên ChienBinh vốn liếng là lớp con cái của NhanVat. Vậy nên tất cả trở thành phải chăng cũng chính vì phát biểu cho tới nằm trong thì ChienBinh cũng là 1 trong những NhanVat. Vì thế quy tắc chú ý cho tới chúng ta này đó là chúng tớ hoàn toàn có thể gán độ quý hiếm một phần tử của lớp con cái cho tới một phần tử của lớp mẹ.

! Tuy nhiên cần thiết xem xét là quy tắc toán theo hướng ngược lại là sai. Chúng tớ ko thể ghi chép chienBinh = nhanVat; vì thế trình biên dịch cấm thực hiện thế và tiếp tục thực hiện treo lịch trình. Hãy xem xét cho tới chiều của quy tắc gán.

Vậy là không tồn tại gì ngăn chặn tất cả chúng ta dùng 1 đối tượng người sử dụng nhập 1 ví trí lẽ ra thuộc sở hữu đối tượng người sử dụng bao quát rộng lớn. Việc này mang lại lợi ích thật nhiều khi tất cả chúng ta thao tác với những thông số của hàm. Ví dụ :

void tanCong(NhanVat &mucTieu) const;

Phương thức tanCong này được cho phép tất cả chúng ta tấn cống bất kể loại anh hùng này cho dù là binh lực, phù thùy, phù thủy Trắng hoặc phù thủy đen giòn cũng chính vì suy cho tới nằm trong thì bọn chúng đều là 1 trong những anh hùng.

Có thể một số trong những các bạn sẽ thấy khá không quen khi ban sơ tuy nhiên rồi tiếp tục xem sét là từng chuyện trọn vẹn phải chăng. Trong thực tiễn, công thức tanCong của tất cả chúng ta tiếp tục đơn giản và giản dị là gọi công thức nhanSatThuong vẫn tồn bên trên nhập toàn bộ những lớp.

Nếu chúng ta vẫn thấy khó khăn hiểu thì van hãy tham khảo lại phần bên trên thêm một lần tiếp nữa.

? Tôi vẫn ko thể nắm rõ tại vì sao quy tắc gán doiTuongMe = doiTuongCon; hoàn toàn có thể triển khai được. Theo tôi thấy thì đối tượng người sử dụng con cái chiếm hữu nhiều tính chất nhưng mà đối tượng người sử dụng u không tồn tại. Vậy thì quy tắc gán nên sở hữu yếu tố mới mẻ đúng không ? Theo chiều ngược lại ko phải chăng rộng lớn à ?

Thực đi ra, sai lầm đáng tiếc của doanh nghiệp là tại đoạn nhận định rằng tất cả chúng ta đang được triển khai quy tắc gán độ quý hiếm những đối tượng người sử dụng trong những lúc ko nên thế. Chúng tớ chỉ đơn giản và giản dị là thay cho thế 1 con cái trỏ. 2 xử lý bên trên trọn vẹn khác hoàn toàn nhau. Các đối tượng người sử dụng vẫn tồn bên trên nhập bộ lưu trữ nhưng mà ko hề Chịu bất kể thay cho thay đổi này. Việc tất cả chúng ta thực hiện chỉ là phía con cái trỏ về phía đối tượng người sử dụng con cái. Đối tượng con cái này tiếp tục bao hàm 2 bộ phận : phần được quá tiếp kể từ lớp u và phần thuộc sở hữu riêng rẽ nó. Xử lý mệnh lệnh doiTuongMe = doiTuongCon; chỉ đơn giản và giản dị phía con cái trỏ doiTuongMe nhập phần chứa chấp những tính chất và công thức thừa kế của doiTuongCon nhưng mà thôi.

Tôi khó khăn hoàn toàn có thể lý giải rõ rệt không chỉ có thế, kỳ vọng là chúng ta vẫn hoàn toàn có thể nắm rõ. Nếu ko thì chúng ta hãy lưu giữ lấy quy tắc nhưng mà tôi đang được nói trên. Ít nhất thì nó sẽ hỗ trợ chúng ta sinh sống sót với C++ trong một thời hạn lâu năm cho dù ko làm rõ hình thức của xử lý dạng này.

Xem thêm: ong gia noel cuoi may con tuan loc

Dù sao thì chúng ta nên biết là nghệ thuật này đặc biệt hữu dụng nhập C++ và được dùng khá thông thường xuyên. Chúng tớ tiếp tục thực hành thực tế nhiều hơn thế nữa về nó nhập phần sau thời điểm chúng ta học tập cơ hội dùng Qt.

Sự thừa kế và công thức khởi tạo

Từ đầu bài học kinh nghiệm cho tới giờ, tôi vẫn ko hề nhắc tới công thức khởi tạo ra. Vậy nên phần tiếp theo sau phía trên tiếp tục dành riêng nhằm nói tới mối quan hệ thân mật công thức này và sự thừa kế.

Chúng tớ đều đã biết lớp NhanVat có một công thức khởi tạo ra đem quyết định.

NhanVat();

… và mã xử lý của chính nó :

NhanVat::NhanVat() : m_hp(100), m_ten("BuBu"){ }

Khi nhưng mà tất cả chúng ta ham muốn dẫn đến 1 đối tượng người sử dụng NhanVat thì công thức này là công thức sẽ tiến hành gọi trước không còn.

Vậy chuyện gì tiếp tục xẩy ra khi giờ đây tất cả chúng ta ham muốn dẫn đến 1 đối tượng người sử dụng PhuThuy thừa kế lớp NhanVat ?

Lớp PhuThuy bạn dạng thân mật nó cũng đều có công thức khởi tạo ra của riêng rẽ bản thân. Liệu nó sẽ bị tác động gì cho tới công thức khởi tạo ra của NhanVat ko ? Trong khi, nó cũng cần được gọi công thức khởi tạo ra của NhanVat còn nếu như không thì sẽ không còn thể gán độ quý hiếm ban sơ cho tới tính chất điểm hp và thương hiệu được.

Thực đi ra, những xử lý sẽ tiến hành triển khai bám theo trật tự sau :

  1. Chúng tớ đòi hỏi dẫn đến đối tượng người sử dụng PhuThuy.
  2. Trình biên dịch trước tiên goi đi ra công thức khởi tạo ra của lớp u (NhanVat).
  3. Tiếp cơ, trình biên dịch gọi công thức khởi tạo ra của lớp con cái.

Tức là công thức khởi tạo ra của lớp u tiếp tục luôn luôn được gọi trước công thức của lớp con cái và rồi tiếp theo lớp con cái được xem là lớp con cháu nếu như sở hữu sự xuất hiện tại của sự việc thừa kế ông chồng hóa học.

Sử dụng công thức khởi tạo ra của lớp mẹ

Để hoàn toàn có thể trước không còn gọi dùng công thức khởi tạo ra của lớp u, chúng ta cần thiết gọi nó kể từ nhập công thức tạo ra của lớp PhuThuy. Trong những tình huống thế này, những các bạn sẽ thấy hiệu suất cao thực tế của nghệ thuật khởi tạo ra bởi vì list độ quý hiếm.

PhuThuy::PhuThuy() : PhuThuy(), m_mp(100){ }

Theo như nhập list, tất cả chúng ta cần thiết trước tiên gọi công thức khởi tạo ra của lớp NhanVat rồi mới mẻ cho tới khởi tạo ra độ quý hiếm cho những tính chất riêng rẽ của lớp PhuThuy (ở đấy là số điểm mp).

! Khi tất cả chúng ta dẫn đến đối tượng người sử dụng PhuThuy thì trình biên dịch dùng công thức khởi tạo ra đem quyết định ko đòi hỏi thông số của lớp u.

Truyền tham lam số

Một trong mỗi quyền lợi lớn số 1 của sự việc thừa kế là được cho phép thông số được tương truyền trong những công thức tạo ra của NhanVatPhuThuy. Ví dụ nếu như công thức khởi tạo ra của NhanVat được cho phép nhận nhập 1 thông số là tên gọi của nhan vật thì công thức khởi tạo ra của lớp PhuThuy cũng nên được cho phép nhận nhập thông số này nhằm truyền cho tới công thức thức của lớp NhanVat.

PhuThuy::PhuThuy(string ten) : NhanVat(ten), m_mana(100){ } NhanVat::NhanVat(string ten) : m_vie(100), m_ten(ten){ }

Và phía trên đó là cơ hội nhưng mà tất cả chúng ta đáp ứng những đối tượng người sử dụng được dẫn đến đúng mực như yêu cầu.

Dưới đấy là 1 sơ vật dụng đơn giản và giản dị sẽ giúp đỡ chúng ta làm rõ rộng lớn tiến bộ trình của những xử lý tất cả chúng ta vừa vặn nhắc tới.

Chúng tớ ham muốn dẫn đến 1 anh hùng phù thủy merlin. Nhưng đấy là 1 đối tượng người sử dụng, vậy nên trình biên dịch tiếp tục gọi công thức khởi tạo ra của lớp PhuThuy. Phương thức khởi tạo ra của PhuThuy lại đòi hỏi trình biên dịch gọi công thức khởi tạo ra của lớp u là lớp NhanVat nên trình biên dịch tiếp tục chính thức kể từ triển khai mã xử lý của công thức này. Sau khi hoàn thành xong thì nó quay trở về và triển khai mã của công thức khởi tạo ra lớp PhuThuy.

Cuối nằm trong, sau thời điểm từng xử lý đều được hoàn thành xong và đối tượng người sử dụng merlin được dẫn đến thì tất cả chúng ta hoàn toàn có thể chính thức dùng anh hùng này cho tới mục tiêu của tất cả chúng ta.

Quyền truy vấn protected

Chúng tớ sẽ không còn thể nhắc tới sự thừa kế nhưng mà bỏ lỡ ko phát biểu cho tới định nghĩa về quyền truy vấn protected.

Trước cơ tất cả chúng ta đang được dò la hiểu về 2 loại quyền truy vấn :

  • public : giành riêng cho những bộ phận hoàn toàn có thể được truy vấn kể từ bên phía ngoài lớp.
  • private : giành riêng cho những bộ phận ko thể được truy vấn kể từ bên phía ngoài lớp.

Những quyền truy vấn bên trên được cho phép tất cả chúng ta vâng lệnh quy tắc vàng về tính chất gói gọn của C++. Quyền truy vấn protected là 1 trong những quyền truy vấn không giống nhưng mà tôi xếp vào tầm khoảng thân mật của publicprivate. Nó chỉ mang trong mình một ý nghĩa sâu sắc rõ ràng nếu như ở nhập lớp đơn vị của sự việc thừa kế (lớp mẹ) tuy nhiên những bạn cũng có thể dùng nó nhập toàn bộ những lớp nếu như muốn bao gồm là nhập tình huống không tồn tại sự thừa kế này.

Ý nghĩa của quyền truy vấn này là những bộ phận của lớp được bảo đảm bởi vì nó sẽ không còn thể được truy vấn kể từ bên phía ngoài trừ là từ là 1 lớp con cái của lớp dùng protected.

Nói cách tiếp theo, nếu như những bộ phận của lớp NhanVat được bảo đảm bởi vì quyền protected thì bọn chúng hoàn toàn có thể được truy vấn kể từ những lớp con cái của lớp NhanVatChienBinhPhuThuy. Chúng tớ sẽ không còn thể truy vấn như thể nếu như quyền truy vấn được dùng là quyền private.

! Trong thực tiễn đưa thì tôi luôn luôn bảo đảm những tính chất của những lớp nhưng mà tôi dẫn đến với quyền truy vấn protected. Kết trái ngược là tôi vẫn đáp ứng được xem gói gọn trừ là nhập tình huống sở hữu dùng tính thừa kế lên những lớp cơ.

Việc này là quan trọng nhằm giảm sút đáng chú ý những công thức lấy và công thức bịa rất cần phải dẫn đến và gom đoạn mã của tất cả chúng ta bớt u ám cút nhiều.

class NhanVat{    public:        NhanVat();        NhanVat(std::string ten);        void nhanSatThuong(int dmg);        void tanCong(NhanVat &mucTieu) const;    protected: //Chi teo the duoc truy cap tu cac lop con cái (ChienBinh, PhuThuy)      int m_hp;      std::string m_ten; };

Chúng tớ hoàn toàn có thể tự do thoải mái thao tác với những tính chất của NhanVat như số điểm hp và thương hiệu kể từ trong số lớp con cái như ChienBinh hoặc PhuThuy.

Ghi đè phương thức

Chúng tớ tiếp tục kết thúc đẩy bài học kinh nghiệm này với định nghĩa ghi đè (override) những công thức thân mật lớp con cái và lớp u.

Phương thức của lớp mẹ

Trò đùa của tất cả chúng ta nhiều khi yên cầu anh hùng tự động reviews về bạn dạng thân mật bản thân. Bởi vì thế đấy là 1 hành vi cộng đồng của toàn bộ những loại anh hùng, bất kể là binh lực hoặc phù thùy, nên địa điểm mến thống nhất cho tới công thức tuGioiThieu() là nhập khai báo của lớp NhanVat.

class NhanVat{    public:        NhanVat();        NhanVat(std::string ten);        void nhanSatThuong(int dmg);        void tanCong(NhanVat &mucTieu) const;        void tuGioiThieu() const;    protected:      int m_hp;      std::string m_ten; };

! Đến giờ chắc hẳn người xem đều đang được vượt lên trên không xa lạ với kể từ khóa const. Tại phía trên nó biểu thị là công thức sẽ không còn được quy tắc thay cho đối đối tượng người sử dụng đơn vị.

Mã xử lý của công thức này nhập tệp .cpp :

void NhanVat::tuGioiThieu() const{    cout << "Xin chao, toi ten la " << m_ten<< "." << endl;    cout << "Toi con cái " << m_hp << " diem hp." << endl; }

Và gọi dùng công thức này nhập hàm main().

int main(){    NhanVat bubu("BuBu");    bubu.tuGioiThieu();    return 0; }

Kết trái ngược tất cả chúng ta tiếp tục cảm nhận được là :

Phương thức thừa kế nhập lớp con

Chiến binh cũng là 1 trong những anh hùng nên cũng hoàn toàn có thể tự động reviews về bạn dạng thân mật bản thân.

int main(){    ChienBinh gauChienBinh("Gau Chien Binh");    gauChienBinh.tuGioiThieu();    return 0; }

Nhân vật Gấu Chiến binh reviews về tay.

Ghi đè

Bây giờ tất cả chúng ta ham muốn rằng những binh lực tiếp tục tự động reviews không giống cút một ít : nên thêm thắt câu reviews thông tin bản thân là binh lực. Vậy nên tất cả chúng ta cần thiết ghi chép thêm một phiên bạn dạng không giống của công thức này cho tới lớp ChienBinh.

void ChienBinh::tuGioiThieu() const{    cout << " Xin chao, toi ten la " << m_ten<< "." << endl;    cout << " Toi con cái " << m_hp << " diem hp." << endl;    cout << "Toi la 1 chien binh dung manh." << endl; }

? Vậy là sở hữu 2 công thức với nằm trong thương hiệu và nằm trong thông số trong một lớp à ? Chúng tớ đâu được quy tắc thực hiện thế ?

Các chúng ta sở hữu phần trúng, cũng đều có phần sai. 2 hàm vốn liếng ko thể sở hữu nguyên vẹn khuôn mẫu như là nhau (giống thương hiệu và như là tham lam số), tuy nhiên lại sở hữu nước ngoài lệ nhập tình huống những lớp thừa kế. Phương thức của lớp ChienBinh tiếp tục thay cho thế công thức được thừa kế kể từ lớp NhanVat.

Nếu tất cả chúng ta dùng công thức này nhập main() thì tiếp tục cảm nhận được thành quả quả thật tất cả chúng ta chờ mong.

Khi tất cả chúng ta dẫn đến 1 công thức sở hữu như là với công thức thừa kế kể từ lớp u thì cơ là việc ghi đè. Phương thức của lớp u có khả năng sẽ bị ghi đè và bị lép vế cút.

! Để lép vế 1 công thức thì chỉ việc dùng nằm trong thương hiệu với công thức được thừa kế là đầy đủ, ko cần thiết số và loại thông số truyền cho tới công thức.

Tính năng này khá là thực dụng ! Khi triển khai thừa kế, lớp con cái tiếp tục tự động hóa cảm nhận được toàn bộ những công thức của lớp u. Nếu nhập số cơ sở hữu công thức nhưng mà tất cả chúng ta ham muốn thay cho thay đổi, tất cả chúng ta tiếp tục ghi chép lại nó nhập lớp con cái và trình biên dịch tiếp tục biết là nên gọi công thức này. Trong ví dụ thì nếu như anh hùng là 1 trong những binh lực thì trình biên dịch tiếp tục dùng phiên bạn dạng nhập lớp ChienBinh của tuGioiThieu(), trong mỗi tình huống còn sót lại như NhanVat hoặc PhuThuy thì nó sẽ bị dùng công thức cơ bạn dạng nhập lớp NhanVat.

Rút gọn gàng mã nguồn

Chúng tớ thậm chí là hoàn toàn có thể nâng cấp xa cách rộng lớn đoạn mã của công thức tự động reviews của những binh lực. Nếu chúng ta xem xét thì nhập công thức của lớp ChienBinh sở hữu 2 dòng sản phẩm mệnh lệnh trùng với những mệnh lệnh được dùng nhập phiên bạn dạng của công thức nhập lớp NhanVat. Chúng tớ hoàn toàn có thể tận dụng tối đa công thức đã biết thành lép vế này nhằm tinh giảm đoạn mã.

! Tận dụng lại những đoạn mã đã có sẵn là 1 trong những thói thân quen đảm bảo chất lượng vì thế sẽ hỗ trợ tất cả chúng ta bảo trì mã mối cung cấp đảm bảo chất lượng rộng lớn. Thông thường thì lười biếng,lười nhác cũng ko nên là 1 trong những tính vượt lên trên xấu xí cool.

Chúng tớ tiếp tục đặc biệt niềm hạnh phúc nếu như hoàn toàn có thể ghi chép như sau :

void ChienBinh::tuGioiThieu() const{    ham_bi_che_khuat();    // Thuc hien cac xu ly teo ban cua lop NhanVat    cout << "Toi la 1 chien binh dung manh." << endl;    // Thuc hien xu ly dac biet cua lop ChienBinh }

Để hoàn toàn có thể dùng hàm đã biết thành lép vế, những các bạn sẽ nên dùng thương hiệu không thiếu của chính nó, nhập tình huống này là NhanVat::tuGioiThiet().

void ChienBinh::tuGioiThieu() const{    NhanVat::tuGioiThiet();    // Thuc hien cac xu ly teo ban cua lop NhanVat    cout << "Toi la 1 chien binh dung manh." << endl;    // Thuc hien xu ly dac biet cua lop ChienBinh }

Và thành quả tất cả chúng ta cảm nhận được vẫn ko hề thay cho thay đổi gì cả.

Dấu :: đó là quy tắc toán được cho phép trình biên xác lập hàm hoặc biến đổi này rất cần được dùng khi có khá nhiều sự lựa chọn

Tóm tắt bài xích hoc :

Xem thêm: vi sao noi giao duc la quoc sach hang dau

  • Sự thừa kế được cho phép thường xuyên biệt hóa 1 lớp.
  • Khi 1 lớp thừa kế 1 lớp không giống thì nó sẽ bị thừa kế toàn bộ những tính chất và công thức của lớp cơ.
  • Chúng tớ hoàn toàn có thể dùng sự thừa kế khi tất cả chúng ta nói cách khác « vật A là 1 trong những vật B » như « tiếng Việt là 1 trong những ngôn ngữ ».
  • Lớp nền tảng của sự việc thừa kế là lớp u, còn lớp thừa kế gọi là lớp con cái.
  • Các công thức khởi tạo ra sẽ tiến hành gọi bám theo trật tự xác định : chính thức kể từ lớp u rồi mới mẻ cho tới lớp con cái.
  • Ngoài quyên truy vấn publicprivate thì còn tồn tại quyền truy vấn protected. Quyền truy vấn này tương tự động như private tuy nhiên thông thoáng rộng lớn 1 chút khi được cho phép những lớp con cái được thao tác thẳng với những bộ phận của lớp u.
  • Nếu 2 công thức sở hữu nằm trong thương hiệu nhập cả lớp u và lớp con cái thì công thức nhập lớp con cái tiếp tục thường xuyên biệt rộng lớn và được dùng nhập tình huống đem quyết định.