tek4

Các kiểu kế thừa trong C++

by - September. 26, 2021
Kiến thức
Học
<p>Trong b&agrave;i trước, ta đ&atilde; t&igrave;m hiểu cơ bản về kế thừa trong C++. Mọi người c&oacute; thể xem tại <a href="https://tek4.vn/ke-thua-trong-c/">đ&acirc;y</a>. Trong b&agrave;i viết n&agrave;y, ch&uacute;ng ta sẽ c&ugrave;ng t&igrave;m hiểu về c&aacute;ch sử dụng c&aacute;c kiểu kế thừa trong C++ bao gồm Public, Protected and Private c&ugrave;ng với c&aacute;c v&iacute; dụ dẫn chứng.</p> <p>Trong kế thừa C ++, ch&uacute;ng ta c&oacute; thể dẫn xuất một lớp con từ lớp cơ sở trong c&aacute;c chế độ truy cập kh&aacute;c nhau.</p> <p>V&iacute; dụ:</p> <pre class="language-cpp"><code>class Cơ_sở { &hellip; }; class Dẫn_xuất: public Cơ_sở { &hellip; };</code></pre> <p>Ch&uacute; &yacute; từ kh&oacute;a Public trong v&iacute; dụ tr&ecirc;n. Điều n&agrave;y c&oacute; nghĩa l&agrave; ch&uacute;ng ta đ&atilde; tạo một lớp dẫn xuất từ lớp cơ sở ở chế độ Public. Ngo&agrave;i ra, ch&uacute;ng ta cũng c&oacute; thể lấy c&aacute;c lớp trong c&aacute;c chế độ Protected hoặc Private. Ba từ kh&oacute;a n&agrave;y được gọi l&agrave; chỉ định truy cập trong kế thừa C ++.</p> <h1>Public, Protected v&agrave; Private trong C ++</h1> <p>Kế thừa Public, Protected v&agrave; Private c&oacute; c&aacute;c đặc điểm sau:</p> <ul> <li>Kế thừa Public l&agrave;m cho c&aacute;c dữ liệu th&agrave;nh vi&ecirc;n của lớp cơ sở được truy cập c&ocirc;ng khai trong lớp dẫn xuất v&agrave; c&aacute;c th&agrave;nh vi&ecirc;n Protected của lớp cơ sở vẫn được bảo vệ truy cập trong lớp dẫn xuất.</li> <li>Kế thừa Protected l&agrave;m cho c&aacute;c dữ liệu th&agrave;nh vi&ecirc;n với chỉ định truy cập l&agrave; Public v&agrave; Protected của lớp cơ sở được bảo vệ trong lớp dẫn xuất.</li> <li>Kế thừa Private l&agrave;m cho c&aacute;c th&agrave;nh vi&ecirc;n với chỉ định truy cập l&agrave; Public v&agrave; Protected của lớp cơ sở trở th&agrave;nh Private trong lớp dẫn xuất.</li> </ul> <p><strong>Ch&uacute; &yacute;: C&aacute;c dữ liệu th&agrave;nh vi&ecirc;n Private của lớp cơ sở kh&ocirc;ng thể truy cập được v&agrave;o lớp dẫn xuất.</strong></p> <h2>Mức độ truy cập trong t&iacute;nh kế thừa Public</h2> <table width="787"> <tbody> <tr> <td>Truy cập</td> <td>Dữ liệu Private</td> <td>Dữ liệu Protected</td> <td>Dữ liệu Public</td> </tr> <tr> <td>Lớp cơ sở</td> <td>C&oacute;</td> <td>C&oacute;</td> <td>C&oacute;</td> </tr> <tr> <td>Lớp dẫn xuất</td> <td>Kh&ocirc;ng</td> <td>C&oacute;</td> <td>C&oacute;</td> </tr> </tbody> </table> <p>V&iacute; dụ: Kế thừa Public.</p> <pre class="language-cpp"><code>#include &lt;iostream&gt; #include &lt;string&gt; using namespace std; class sinh_vien { private: int ID_sv; protected: string truong_hoc; public: void setID(int a) { ID_sv = a; } int getID() { return ID_sv; } void in_thong_tin(){ cout &lt;&lt; "Toi la sinh vien" &lt;&lt; endl; } }; class sv1 : public sinh_vien { public: void set_truong_hoc(string a) { truong_hoc = a; } void in_thong_tin() { cout &lt;&lt; "Toi den tu " &lt;&lt; truong_hoc &lt;&lt; endl; cout &lt;&lt; "ID la: " &lt;&lt; getID() &lt;&lt; endl; } }; int main() { sv1 sv; sv.setID(21); sv.set_truong_hoc("Truong B1"); sv.in_thong_tin(); return 0; }</code></pre> <p>Ở đ&acirc;y, biến ID_sv thuộc phạm vi Private của lớp cơ sở, do đ&oacute;, lớp dẫn xuất kh&ocirc;ng thể truy cập v&agrave;o biến n&agrave;y. Ta đ&atilde; tạo một h&agrave;m getID() trong lớp cơ sở l&agrave; sinh_vien để truy cập được biến ID_sv. Ngo&agrave;i ra, truong_hoc l&agrave; biến Protected, n&ecirc;n ta khai b&aacute;o một h&agrave;m trong lớp dẫn xuất để g&aacute;n gi&aacute; trị cho biến n&agrave;y, ta sẽ kh&ocirc;ng thể g&aacute;n gi&aacute; trị cho biến truong_hoc trong h&agrave;m main().</p> <h2>Mức độ truy cập trong t&iacute;nh kế thừa Protected</h2> <table width="787"> <tbody> <tr> <td>Truy cập</td> <td>Th&agrave;nh vi&ecirc;n Private</td> <td>Th&agrave;nh vi&ecirc;n Protected</td> <td>Th&agrave;nh vi&ecirc;n Public</td> </tr> <tr> <td>Lớp cơ sở</td> <td>C&oacute;</td> <td>C&oacute;</td> <td>C&oacute;</td> </tr> <tr> <td>Lớp dẫn xuất</td> <td>Kh&ocirc;ng</td> <td>C&oacute;</td> <td>C&oacute; (kế thừa v&agrave; c&aacute;c biến trong phạm vi Protected)</td> </tr> </tbody> </table> <p>V&iacute; dụ: Kế thừa Protected.</p> <pre class="language-cpp"><code>#include &lt;iostream&gt; #include &lt;string&gt; #include&lt;cstring&gt; using namespace std; class sinh_vien { private: int ID_sv = 1; protected: string truong_hoc; public: int maso_sv = 4112; int getID() { return ID_sv; } }; class sv1 : protected sinh_vien { public: void set_truong_hoc(string a) { truong_hoc = a; } void int_thong_tin() { cout &lt;&lt; "Toi den tu " &lt;&lt; truong_hoc &lt;&lt; endl; cout &lt;&lt; "ID la: " &lt;&lt; getID() &lt;&lt; endl; cout &lt;&lt; "Ma so sinh vien: " &lt;&lt; maso_sv; } }; int main() { sv1 sv; sv.set_truong_hoc("Truong B1"); sv.int_thong_tin(); return 0; }</code></pre> <p>Kết quả:</p> <pre class="language-markup"><code>Toi den tu Truong B1 ID la: 1 Ma so sinh vien: 4112</code></pre> <p>Ở đ&acirc;y, ta đ&atilde; sử dụng kế thừa Protected. Do đ&oacute;, biến th&agrave;nh vi&ecirc;n truong_hoc, maso_sv v&agrave; h&agrave;m getID trong lớp cơ sở sinh_vien được kế thừa Protected bởi lớp dẫn xuất sv1. Tuy nhi&ecirc;n ID_sv sẽ kh&ocirc;ng thể truy cập bởi lớp dẫn xuất bởi n&oacute; thuộc phạm vi private của lớp cơ sở.</p> <p>Ngo&agrave;i ra, ta sẽ kh&ocirc;ng thể truy cập trực tiếp v&agrave;o maso_sv ở lớp cơ sở m&agrave; phải tạo một h&agrave;m th&agrave;nh vi&ecirc;n trong lớp dẫn xuất l&agrave; in_thong_tin để truy cập được.</p> <h2>Mức độ truy cập trong t&iacute;nh kế thừa Private</h2> <table style="width: 98.1385%; height: 143px;" width="787"> <tbody> <tr> <td>Truy cập</td> <td>Dữ liệu Private</td> <td>Dữ liệu Protected</td> <td>Dữ liệu Public</td> </tr> <tr> <td>Lớp cơ sở</td> <td>C&oacute;</td> <td>C&oacute;</td> <td>C&oacute;</td> </tr> <tr> <td>Lớp dẫn xuất</td> <td>Kh&ocirc;ng</td> <td>C&oacute; (C&aacute;c biến thuộc phạm vi Private)</td> <td>C&oacute; (C&aacute;c biến thuộc phạm vi Private)</td> </tr> </tbody> </table> <p>V&iacute; dụ: Kế thừa Private</p> <pre class="language-cpp"><code>#include &lt;iostream&gt; #include &lt;string&gt; #include&lt;cstring&gt; using namespace std; class sinh_vien { private: int ID_sv = 1; protected: string truong_hoc; public: int maso_sv = 4112; int getID() { return ID_sv; } }; class sv1 : private sinh_vien { public: void set_truong_hoc(string a) { truong_hoc = a; } void in_thong_tin() { cout &lt;&lt; "Toi den tu " &lt;&lt; truong_hoc &lt;&lt; endl; cout &lt;&lt; "ID la: " &lt;&lt; getID() &lt;&lt; endl; cout &lt;&lt; "Ma so sinh vien: " &lt;&lt; maso_sv; } }; int main() { sv1 sv; sv.set_truong_hoc("Truong B1"); sv.in_thong_tin(); return 0; }</code></pre> <p>Kết quả:</p> <pre class="language-markup"><code>Toi den tu Truong B1 ID la: 1 Ma so sinh vien: 4112</code></pre> <p>Ở đ&acirc;y, kết quả trong v&iacute; dụ n&agrave;y giống với v&iacute; dụ b&ecirc;n tr&ecirc;n. Tuy nhi&ecirc;n, n&oacute; kh&aacute;c ở chỗ c&aacute;c dữ liệu th&agrave;nh vi&ecirc;n trong lớp cơ sở sinh_vien gồm truong_hoc, maso_sv, getID sẽ l&agrave; dữ liệu th&agrave;nh vi&ecirc;n trong phạm vi private của lớp dẫn xuất sv1.</p> <p>Tr&ecirc;n đ&acirc;y l&agrave; c&aacute;c v&iacute; dụ cơ bản về c&aacute;c kiểu kế thừa trong C++. Hy vọng mọi người c&oacute; thể &aacute;p dụng được v&agrave;o trong chương tr&igrave;nh của m&igrave;nh. Mọi người h&atilde;y tiếp tục theo d&otilde;i c&aacute;c b&agrave;i mới nhất tr&ecirc;n <a href="http://tek4.vn">tek4</a> nh&eacute;!</p>