tek4

Đa hình trong C++

by - September. 25, 2021
Kiến thức
Học
<p>Đa h&igrave;nh trong C++ l&agrave; một kh&aacute;i niệm quan trọng của lập tr&igrave;nh hướng đối tượng. N&oacute; chỉ đơn giản c&oacute; nghĩa l&agrave; nhiều hơn một dạng. Nghĩa l&agrave;, một thực thể (chức năng hoặc to&aacute;n tử) hoạt động kh&aacute;c nhau trong c&aacute;c t&igrave;nh huống kh&aacute;c nhau.</p> <p>V&iacute; dụ:</p> <p>To&aacute;n tử + trong C ++ được sử dụng để thực hiện hai chức năng cụ thể. Khi n&oacute; được sử dụng với c&aacute;c số (số nguy&ecirc;n v&agrave; số thực), n&oacute; thực hiện ph&eacute;p cộng.</p> <pre class="language-cpp"><code>int a = 1; int b = 3; int tong = a + b;</code></pre> <p>Nhưng khi ch&uacute;ng ta sử dụng n&oacute; với kiểu dữ liệu string, th&igrave; n&oacute; sẽ thực hiện thao t&aacute;c nối c&aacute;c chuỗi k&yacute; tự lại với nhau.</p> <pre class="language-cpp"><code>String ten = "A"; String ten_dem = "Thi"; String ho_dem = "Nguyen"; String ten_day_du = ho_dem + ten_dem + ten;</code></pre> <p>Ch&uacute;ng ta c&oacute; thể triển khai t&iacute;nh đa h&igrave;nh trong C ++ bằng c&aacute;c c&aacute;ch sau:</p> <ol> <li>Nạp chồng h&agrave;m</li> <li>Nạp chồng to&aacute;n tử</li> <li>Ghi đ&egrave; h&agrave;m</li> <li>H&agrave;m ảo</li> </ol> <h2>Nạp chồng h&agrave;m</h2> <p>Trong C ++, ch&uacute;ng ta c&oacute; thể sử dụng hai h&agrave;m c&oacute; c&ugrave;ng t&ecirc;n nếu ch&uacute;ng c&oacute; c&aacute;c tham số kh&aacute;c nhau (kiểu dữ liệu hoặc số lượng đối số). T&ugrave;y thuộc v&agrave;o số lượng hoặc kiểu đối số, c&aacute;c h&agrave;m kh&aacute;c nhau sẽ được gọi.</p> <p>V&iacute; dụ:</p> <pre class="language-cpp"><code>#include &lt;iostream&gt; using namespace std; int phep_cong(int a, int b) { return a + b; } float phep_cong(float a, float b) { return a + b; } int phep_cong(int a, int b, int c) { return a + b + c; } int main() { cout &lt;&lt; phep_cong(1, 2) &lt;&lt; endl; cout &lt;&lt; phep_cong(1.6f, 2.7f) &lt;&lt; endl; cout &lt;&lt; phep_cong(1, 2, 3) &lt;&lt; endl; return 0; }</code></pre> <p>Kết quả:</p> <pre class="language-markup"><code>3 4.3 6</code></pre> <p>Trong đoạn m&atilde; tr&ecirc;n, ta đ&atilde; thực hiện khai b&aacute;o 3 h&agrave;m phep_cong kh&aacute;c nhau với c&aacute;c tham số v&agrave; kiểu dữ liệu c&aacute;c tham số l&agrave; kh&aacute;c nhau. Dựa tr&ecirc;n c&aacute;c gi&aacute; trị được truyền v&agrave;o, tr&igrave;nh bi&ecirc;n dịch sẽ c&oacute; thể ph&acirc;n biệt c&aacute;c h&agrave;m phep_cong để gọi sao cho ph&ugrave; hợp.</p> <p>Ngo&agrave;i ra, khi ta truyền tham số phep_cong(1.6f, 2.7f), trong đ&oacute; 1.6f v&agrave; 2.7f l&agrave; c&aacute;ch truyền tham số kiểu dữ liệu float, để tr&aacute;nh bị nhầm kiểu dữ liệu double trong C++. Trong C++, mặc định c&aacute;c hằng số 1.66 sẽ l&agrave; kiểu dữ liệu double, do đ&oacute;, nếu ta truyền tham số cho h&agrave;m phep_cong l&agrave; phep_cong(1.6, 2.7) th&igrave; tr&igrave;nh bi&ecirc;n dịch sẽ th&ocirc;ng b&aacute;o lỗi.</p> <h2>Nạp chồng to&aacute;n tử</h2> <p>Trong C ++, ch&uacute;ng ta c&oacute; thể nạp chồng một to&aacute;n tử. Ch&uacute;ng ta kh&ocirc;ng thể sử dụng nạp chồng to&aacute;n tử cho c&aacute;c kiểu dữ liệu cơ bản như int, double, float. Nạp chồng to&aacute;n tử về cơ bản l&agrave; nạp chồng h&agrave;m, trong đ&oacute; c&aacute;c h&agrave;m to&aacute;n tử kh&aacute;c nhau c&oacute; c&ugrave;ng k&yacute; hiệu nhưng c&aacute;c to&aacute;n hạng kh&aacute;c nhau. V&agrave;, t&ugrave;y thuộc v&agrave;o to&aacute;n hạng, c&aacute;c h&agrave;m to&aacute;n tử kh&aacute;c nhau được thực thi.</p> <p>V&iacute; dụ:</p> <pre class="language-cpp"><code>#include &lt;iostream&gt; using namespace std; class phep_cong { private: int gia_tri; public: phep_cong(){ gia_tri = 2; } void operator ++(int) { gia_tri += 9; } void in_gia_tri() { cout &lt;&lt; "Gia tri la: " &lt;&lt; gia_tri &lt;&lt; endl; } }; int main() { phep_cong a; a++; a.in_gia_tri(); return 0; }</code></pre> <p>Kết quả:</p> <pre class="language-markup"><code>Gia tri la: 11</code></pre> <p>Trong đoạn m&atilde; tr&ecirc;n, b&igrave;nh thường to&aacute;n tử a++ sẽ l&agrave; a = a + 1. Nhưng do ta đ&atilde; nạp chồng to&aacute;n tử ++, n&ecirc;n khi thực hiện a++ ta sẽ c&oacute; a = a + 9. Kết quả sẽ l&agrave; a = 2 + 9 = 11.</p> <h2>Ghi đ&egrave; h&agrave;m</h2> <p>Trong t&iacute;nh kế thừa C ++, ch&uacute;ng ta c&oacute; thể c&oacute; c&ugrave;ng một h&agrave;m trong lớp cơ sở cũng như c&aacute;c lớp dẫn xuất của n&oacute;. Khi ch&uacute;ng ta gọi h&agrave;m bằng c&aacute;ch sử dụng một đối tượng của lớp dẫn xuất, th&igrave; h&agrave;m của lớp dẫn xuất được thực thi thay v&igrave; h&agrave;m trong lớp cơ sở. V&igrave; vậy, c&aacute;c h&agrave;m kh&aacute;c nhau sẽ được thực thi t&ugrave;y thuộc v&agrave;o đối tượng gọi h&agrave;m.</p> <p>V&iacute; dụ:</p> <pre class="language-cpp"><code>#include &lt;iostream&gt; using namespace std; class sinh_vien { public: void in_thong_tin() { cout &lt;&lt; "Day la lop sinh vien co so" &lt;&lt; endl; } }; class sinh_vien1 : public sinh_vien { public: void in_thong_tin() { cout &lt;&lt; "Day la lop sinh vien 1" &lt;&lt; endl; } }; int main() { sinh_vien1 sv1; sv1.in_thong_tin(); return 0; }</code></pre> <p>Kết quả:</p> <pre class="language-markup"><code>Day la lop sinh vien 1</code></pre> <h2>H&agrave;m ảo</h2> <p>Trong C ++, ch&uacute;ng ta c&oacute; thể kh&ocirc;ng ghi đ&egrave; c&aacute;c h&agrave;m nếu ch&uacute;ng ta sử dụng một con trỏ của lớp cơ sở để trỏ đến một đối tượng của lớp dẫn xuất. Việc sử dụng c&aacute;c h&agrave;m ảo trong lớp cơ sở đảm bảo rằng h&agrave;m c&oacute; thể được ghi đ&egrave; trong c&aacute;c trường hợp n&agrave;y.</p> <p>V&iacute; dụ:</p> <pre class="language-cpp"><code>#include &lt;iostream&gt; using namespace std; class sinh_vien { public: virtual void in_thong_tin() { cout &lt;&lt; "Day la lop sinh vien co so" &lt;&lt; endl; } }; class sinh_vien1 : public sinh_vien { public: void in_thong_tin() { cout &lt;&lt; "Day la lop sinh vien 1" &lt;&lt; endl; } }; int main() { sinh_vien1 sv1; sinh_vien *con_tro; con_tro = &amp;sv1; con_tro -&gt; in_thong_tin(); return 0; }</code></pre> <p>Kết quả:</p> <pre class="language-markup"><code>Day la lop sinh vien 1</code></pre> <h2>Tại sao phải cần t&iacute;nh đa h&igrave;nh trong C++?</h2> <p>T&iacute;nh đa h&igrave;nh cho ph&eacute;p ch&uacute;ng ta tạo c&aacute;c đoạn m&atilde; nhất qu&aacute;n.</p> <p>V&iacute; dụ: Giả sử ch&uacute;ng ta cần in ra th&ocirc;ng tin về c&aacute;c sinh vi&ecirc;n của c&aacute;c trường kh&aacute;c nhau. Để l&agrave;m như vậy, ch&uacute;ng ta c&oacute; thể tạo một lớp sinh_vien v&agrave; hai lớp dẫn xuất của lớp sinh_vien l&agrave; lớp sinh vi&ecirc;n trường luật v&agrave; lớp sinh vi&ecirc;n trường y. Trong trường hợp n&agrave;y, nhờ c&oacute; t&iacute;nh đa h&igrave;nh, ta sẽ tạo một h&agrave;m c&oacute; c&ugrave;ng t&ecirc;n l&agrave; in_thong_tin() trong cả hai lớp dẫn xuất thay v&igrave; tạo c&aacute;c h&agrave;m phải c&oacute; t&ecirc;n kh&aacute;c nhau, dễ g&acirc;y ra sự nhầm lẫn v&agrave; kh&oacute; hiểu.</p> <p>Tr&ecirc;n đ&acirc;y l&agrave; kh&aacute;i niệm v&agrave; v&iacute; dụ cơ bản về t&iacute;nh đa h&igrave;nh trong C++. Hy vọng mọi người c&oacute; thể &aacute;p dụng 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 tiếp theo v&agrave; cập nhật c&aacute;c b&agrave;i mới nhất tr&ecirc;n <a href="http://tek4.vn">tek4</a> nh&eacute;!</p>