TÍNH ĐA HÌNH LÀ GÌ

     

Trong bài bác trước, họ hiểu được thế nào làtính kế thừatrong OOP. Ở bài này họ sẽ tham khảo thêm một đặc điểm nữa của lập trình hướng đối tượng người dùng đó là tính đa hình nhé.

Bạn đang xem: Tính đa hình là gì

Tính đa hình là gì ?

Sự kế thừa trong C++ chất nhận được có sự khớp ứng giữa lớp đại lý và những lớp dẫn xuất vào sơ đồ vật thừa kế:

Một bé trỏ gồm kiểu lớp cơ sở luôn hoàn toàn có thể trỏ đến địa chỉ của một đối tượng người tiêu dùng của lớp dẫn xuất.Tuy nhiên, khi thực hiện lời hotline một phương thức của lớp, trình biên dịch sẽ xem xét kiểu của con trỏ chứ không hề phải đối tượng người tiêu dùng mà bé trỏ đã trỏ tới: phương thức của lớp mà con trỏ có kiểu được điện thoại tư vấn chứ chưa phải phương thức của đối tượng người dùng mà con trỏ đã trỏ tới được gọi.

Ví dụ:Lớp mayAcer thừa kế từ lớp Mayvitinh, cả hai lớp này đầy đủ định nghĩa cách làm show()

class Mayvitinh{ public: void show(){ cout khi đó, nếu như ta khai báo một nhỏ trỏ lớp mayAcer, tuy thế lại trỏ vào showroom của một đối tượng người dùng lớp Mayvitinh:

mayAcer may1; Mayvitinh *tenmay = &may1;tenmay->show(); thì lịch trình sẽ điện thoại tư vấn đến thủ tục show() của lớp Mayvitinh, mà không hotline tới phương thức show() của lớp mayAcer.Để giải quyết và xử lý vấn đề này, chúng ta cần thực hiện đến tính nhiều hình trong Lập trình hướng đối tượng. Mình đang giải thích chi tiết hơn ở bên dưới.

Đa hình (polymorphism)nghĩa là có khá nhiều hình thái khác nhau. Tiêu biểu vượt trội là, đa hình lộ diện khi bao gồm một cấu trúc cấp bậc của các lớp và chúng tương quan với nhau vày tính kế thừa.

Mình rước một lấy ví dụ thực cụ nhé:Một người cùng một lúc rất có thể có điểm sáng khác nhau. Giống hệt như một người lũ học sinh thời là một người con trai, một tín đồ bạn, một người anh. Bởi vì vậy, thuộc một người sở hữu hồ hết hành vi khác biệt trong các tình huống khác nhau. Điều này được điện thoại tư vấn là đa hình.

Đa hình được coi là một trong những tính năng đặc trưng của Lập trình hướng đối tượng.

Các nhiều loại đa hình:

Tính đa hình đa số được phân thành hai loại:

Compile time Polymorphism.Runtime Polymorphism.

*

1. Compile time Polymorphism:

Tính đa hình này được sử dụng bằng phương pháp nạp ông xã hàm hoặc nạp ck toán tử.

Vậy nạp chồng hàm với nạp ck toán tử là gì?

Nạp ông chồng hàm

Nạp chồng hàm (Function Overloading)cho phép thực hiện cùng một tên thường gọi cho những hàm “giống nhau” (có cùng mục đích). Nhưng khác biệt về kiểu tài liệu tham số hoặc con số tham số.

Nạp chồng hàm được cho phép ta khai báo cùng định nghĩa những hàm trên cùng với một tên gọi.

Xem thêm: Facilitator Là Gì Ý Nghĩa Payment Facilitator Là Gì, Facilitator Là Gì

Chúng ta mang ví dụ:

#include using namespace std; class inDuLieu { public: void hamIn(int i) { cout Biên dịch chương trình ta có kết quả:

Trong lấy ví dụ như trên, ta chỉ cần sử dụng một hàm duy nhất mang tên làhamIn()nhưng hoàn toàn có thể dùng được cho 3 trường hợp khác nhau. Đây là 1 thể hiện tại của tính nhiều hình.

Nạp ck toán tử

Nạp ông xã toán tử (Operator Overloading) được dùng để định nghĩa toán tử cho tất cả sẵn trong c++ ship hàng cho dữ liệu riêng do các bạn tạo ra.

Giả sử tất cả lớpPhanSovà có các phương thức giám sát như Cong, Tru, Nhan, Chia.Nếu gặp một biểu thức phức tạp, số lượng phép tính những thì câu hỏi sử dụng những phương thức bên trên khá trở ngại và rất có thể gây rối cho những người lập trình. Chính vì vậy ta đã nạp chồng lại những toán tử để hoàn toàn có thể tạo một chiếc nhìn trực quan lại vào code, sút thiểu những lỗi không nên không đáng có.

Các toán tử có thể nạp chồng

*

Các toán tử không thể nạp chồng:

..*::?:

Ví dụ:

#include using namespace std;class Box public: double tinhTheTich(void) return chieudai * chieurong * chieucao; void setChieuDai( double dai ) chieudai = dai; void setChieuRong( double rong ) chieurong = rong; void setChieuCao( double cao ) chieucao = cao; // Nap chong toa tu + de cong hai doi tuong Box. Box operator+(const Box& b) Box box; box.chieudai = this->chieudai + b.chieudai; box.chieurong = this->chieurong + b.chieurong; box.chieucao = this->chieucao + b.chieucao; return box; private: double chieudai; // chieu dẻo cua mot box double chieurong; // Chieu rong cua mot box double chieucao; // Chieu cao cua mot box;// ham mê main cua chuong trinhint main( ){ Box Box1; // Khai bao Box1 la cua kieu Box Box Box2; // Khai bao Box2 la cua kieu Box Box Box3; // Khai bao Box3 la cua kieu Box double thetich = 0.0; // Luu giu the tich cua mot box tai day // thong tin bỏ ra tiet cua box 1 Box1.setChieuDai(5); Box1.setChieuRong(2); Box1.setChieuCao(4); // thong tin đưa ra tiet cua box 2 Box2.setChieuDai(7); Box2.setChieuRong(6); Box2.setChieuCao(9); // the tich cua box 1 thetich = Box1.tinhTheTich(); cout sau khoản thời gian chạy chương trình cho kết quả:

Trong lấy ví dụ trên, ta sẽ nạp ông xã lại toán tử cộng. Tính nhiều hình được biểu lộ qua câu hỏi nạp ck để tính tổng Box1 và Box2.

2. Runtime Polymorphism:

Các bàn còn ghi nhớ ví dụ đầu tiên của bài không.

#include using namespace std;class Mayvitinh{ public: void show() cout show(); Có thể thấy chương trình sau khoản thời gian chạy sẽgọi đến cách thức show() của lớp Mayvitinh, mà không điện thoại tư vấn tới phương thức show() của lớp mayAcer.

Vậy nhằm chương trình gọi tới phương thức show() của lớp mayAcer ta thực hiện hàm ảo virtual như sau:

#include using namespace std;class Mayvitinh{ public: virtual void show() cout show(); Sau khi biên dịch chương trình sẽ sở hữu kết quả:

Trong ví dụ như trên mình đã thêm tự khóavirtualvào hàmshow()trong lớp cơ sởMayvitinh.Từ khóavirtualnày dùng để làm khai báo một hàm là hàm ảo.

Khi khai báo hàm ảo với tự khóavirtualnghĩa là hàm này sẽ được gọi theo loại đối tượng người tiêu dùng được trỏ (hoặc tham chiếu), chứ không phải theo nhiều loại của con trỏ (hoặc tham chiếu). Và điều này dẫn đến hiệu quả khác nhau:

Nếu không khai báo hàm ảovirtualtrình biên dịch sẽ gọi hàm trên lớp cở sởNếu cần sử dụng hàm ảovirtualtrình biên dịch sẽ hotline hàm trên lớp dẫn xuất

Khi nhận biết có khai báovirtualtrong lớp cơ sở, trình biên dịch sẽ chế tạo mỗi đối tượng của lớp cơ sở và những lớp dẫn xuất của nó một con trỏ chỉ cho bảng thủ tục ảo (virtual function table). Nhỏ trỏ đó có tên là vptr (virtual pointer). Bảng phương thức ảo là khu vực chứa các con trỏ chỉ mang đến đoạn công tác đã biên dịch ứng với những phương thức ảo. Từng lớp tất cả một bảng cách tiến hành ảo. Trình biên dịch chỉ lập bảng phương thức ảo khi bắt đầu có bài toán tạo đối tượng người tiêu dùng của lớp. Đến khi chương trình chạy, phương thức ảo của đối tượng người tiêu dùng mới được nối kết và thi hành trải qua con trỏ vptr.

Kết

Vậy là series Lập trình phía đối tượng của bản thân mình đến đó là kết thúc, họ đã được mày mò các định nghĩa xoay xung quanh OOP vào C++ và phần đa tính chất quan trọng của nó. Mình hy vọng bài viết của mình sẽ một trong những phần giúp các ban trong việc học tập lập trình, đặc biệt là tìm hiểu về OOP.

Xem thêm: Mẫu Tờ Khai Thông Quan Tiếng Anh Là Gì, Hải Quan Trong Tiếng Tiếng Anh

Nếu chúng ta có thắc mắc hay câu hỏi gì bao gồm thể comment và rate bên dưới bài viết. Mình hy vọng sẽ cảm nhận sự cỗ vũ của chúng ta trong những bài khác với chủ đề khác.