Polymorphism là gì
Trong bài bác trước, chúng ta hiểu được đà nào làtính kế thừatrong OOP. Ở bài xích này họ sẽ xem thêm một đặc điểm nữa của lập trình sẵn hướng đối tượng người dùng đó là tính đa hình nhé.Bạn vẫn xem: Polymorphism là gì
Tính đa hình là gì ?
Sự kế thừa trong C++ được cho phép có sự tương ứng giữa lớp các đại lý và những lớp dẫn xuất vào sơ đồ dùng thừa kế:
Một bé trỏ tất cả kiểu lớp cửa hàng luôn hoàn toàn có thể trỏ đến địa chỉ cửa hàng 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 điện thoại tư vấn một thủ tục của lớp, trình biên dịch sẽ để ý đến kiểu của nhỏ trỏ chứ không cần phải đối tượng người sử dụng mà con trỏ đang trỏ tới: cách làm của lớp mà con trỏ gồm kiểu được call chứ không hẳn phương thức của đối tượng người sử dụng mà nhỏ trỏ vẫn trỏ tới được gọi.Bạn đang xem: Polymorphism là gì
Ví dụ:Lớp mayAcer kế thừa từ lớp Mayvitinh, cả nhị lớp này đầy đủ định nghĩa cách thức show()
class Mayvitinh{ public: void show(){ cout khi đó, nếu ta khai báo một con trỏ lớp mayAcer, tuy nhiên lại trỏ vào địa chỉ cửa hàng của một đối tượng người tiêu dùng lớp Mayvitinh:
mayAcer may1; Mayvitinh *tenmay = &may1;tenmay->show(); thì lịch trình sẽ call đến cách làm show() của lớp Mayvitinh, nhưng không call tới thủ tục show() của lớp mayAcer.Để xử lý vấn đề này, họ cần áp dụng đến tính nhiều hình vào 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 là, đa hình lộ diện khi bao gồm một kết cấu cấp bậc của những lớp cùng chúng liên quan với nhau bởi tính kế thừa.
Mình mang một ví dụ như thực cầm nhé:Một bạn cùng một lúc có thể có điểm lưu ý khác nhau. Y như một người bầy học sinh thời là 1 trong những người nhỏ trai, một fan bạn, một fan anh. Bởi vậy, cùng một bạn sở hữu phần đa hành vi khác biệt trong các trường hợp khác nhau. Điều này được call là đa hình.
Đa hình được xem là một một trong những tính năng quan 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 chủ yếu đượ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 cách nạp chồng hàm hoặc nạp ck toán tử.
Vậy nạp ông xã hàm và nạp ông xã toán tử là gì?
Nạp ông xã hàmNạp ông chồng hàm (Function Overloading)cho phép sử dụng cùng một tên thường gọi cho các hàm “giống nhau” (có thuộc mục đích). Nhưng không giống nhau về kiểu tài liệu tham số hoặc số lượng tham số.
Chúng ta rước ví dụ:
#include using namespace std; class inDuLieu { public: void hamIn(int i) { cout Biên dịch công tác ta tất cả kết quả:
Trong lấy một ví dụ trên, ta chỉ sử dụng một hàm duy nhất có tên làhamIn()nhưng hoàn toàn có thể dùng được cho 3 tình huống khác nhau. Đây là một trong thể hiện của tính nhiều hình.
Xem thêm: Chuyên Mục Cuộc Sống: Tình Cảm Gia Đình Là Gì ? Có Ý Nghĩa Gì? Vai Trò Ra Sao
Nạp chồng toán tử (Operator Overloading) được dùng làm định nghĩa toán tử cho bao gồm sẵn vào c++ phục vụ cho tài liệu riêng do chúng ta tạo ra.
Giả sử có lớpPhanSovà có các phương thức giám sát như Cong, Tru, Nhan, Chia.Nếu chạm mặt một biểu thức phức tạp, số lượng phép tính nhiều thì câu hỏi sử dụng những phương thức trên khá trở ngại và có thể gây rối cho tất cả những người lập trình. Chính vì thế ta vẫn nạp ck lại các 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, bớt thiểu những lỗi không đúng không đáng có.
Các toán tử có thể nạp chồng

Các toán tử quan trọng 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 nhì 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 dai 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 chi 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 đến kết quả:
Trong lấy ví dụ như trên, ta sẽ nạp ck lại toán tử cộng. Tính nhiều hình được biểu đạt qua việc nạp ông chồng để tính tổng Box1 với Box2.
2. Runtime Polymorphism:Các bàn còn 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 thời điểm chạy sẽgọi đến cách làm show() của lớp Mayvitinh, nhưng không hotline tới cách tiến hành show() của lớp mayAcer.
Vậy nhằm chương trình call tới cách tiến hành 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 lúc biên dịch chương trình sẽ có được kết quả:
Trong ví dụ như trên tôi đã thêm từ khóavirtualvào hàmshow()trong lớp cơ sởMayvitinh.Từ khóavirtualnày dùng để 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 sử dụng được trỏ (hoặc tham chiếu), chứ không phải theo nhiều loại của bé trỏ (hoặc tham chiếu). Và điều đó dẫn đến kết quả khác nhau:
Nếu không khai báo hàm ảovirtualtrình biên dịch sẽ call hàm trên lớp cở sởNếu cần sử dụng hàm ảovirtualtrình biên dịch sẽ điện thoại tư vấn hàm tại lớp dẫn xuấtKhi phân biệt có khai báovirtualtrong lớp cơ sở, trình biên dịch sẽ cung ứng mỗi đối tượng người tiêu dùng của lớp cơ sở và các lớp dẫn xuất của nó một bé trỏ chỉ mang lại bảng thủ tục ảo (virtual function table). Con trỏ đó mang tên là vptr (virtual pointer). Bảng cách tiến hành ảo là địa điểm chứa các con trỏ chỉ đến đoạn lịch trình đã biên dịch ứng với những phương thức ảo. Mỗi lớp tất cả một bảng phương thức ảo. Trình biên dịch chỉ lập bảng phương thức ảo khi bắt đầu có việc tạo đối tượng người sử dụng của lớp. Đến khi công tác chạy, thủ tục ảo của đối tượng mới được nối kết với thi hành trải qua con trỏ vptr.
Kết
Vậy là series Lập trình hướng đối tượng của chính mình đến đây là kết thúc, chúng ta đã được tò mò các khái niệm xoay xung quanh OOP trong C++ và hồ hết tính chất đặc biệt của nó. Bản thân hy vọng bài viết của bản thân sẽ 1 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: Các Kiểu Môi Trường Của Đới Ôn Hòa Là Gì? Định Nghĩa, Khái Niệm
Nếu các bạn có thắc mắc hay câu hỏi gì tất cả thể comment và rate bên dưới bài viết. Mình mong muốn sẽ nhận ra sự ủng hộ của chúng ta trong những bài khác với chủ thể khác.