Tính Đa Hình Là Gì

     

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

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

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

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

Một bé trỏ gồm kiểu lớp cửa hàng luôn có thể trỏ đến add của một đối tượng của lớp dẫn xuất.Tuy nhiên, khi thực hiện lời gọi một cách tiến hành của lớp, trình biên dịch sẽ suy xét kiểu của nhỏ trỏ chứ không hề phải đối tượng người dùng mà bé trỏ đang trỏ tới: thủ tục của lớp mà bé trỏ gồm kiểu được call chứ chưa phải phương thức của đối tượng người dùng mà con trỏ sẽ trỏ cho tới được gọi.

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

class Mayvitinh{ public: void show(){ cout lúc đó, giả dụ ta khai báo một bé trỏ lớp mayAcer, mà lại lại trỏ vào add của một đối tượng lớp Mayvitinh:

mayAcer may1; Mayvitinh *tenmay = &may1;tenmay->show(); thì lịch trình sẽ hotline đến cách làm show() của lớp Mayvitinh, nhưng không call tới cách làm show() của lớp mayAcer.Để giải quyết vấn đề này, chúng ta cần sử 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ó rất nhiều hình thái không giống nhau. Tiêu biểu vượt trội là, đa hình mở ra khi có một cấu tạo cấp bậc của các lớp và chúng liên quan với nhau do tính kế thừa.

Mình rước một lấy ví dụ thực nỗ lực nhé:Một bạn cùng một lúc rất có thể có đặc điểm khác nhau. Y như một người lũ học sinh thời là 1 trong những người nhỏ trai, một fan bạn, một fan anh. Vày vậy, cùng một tín đồ sở hữu hầu hết hành vi không giống nhau trong các trường hợp khác nhau. Điều này được hotline là đa hình.

Đa hình được xem như là một giữa 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 đa phần được tạo 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 ck hàm hoặc nạp ông chồng toán tử.

Vậy nạp ông chồng hàm cùng nạp ông xã toán tử là gì?

Nạp ông xã hàm

Nạp chồng hàm (Function Overloading)cho phép thực hiện cùng một tên gọi cho những hàm “giống nhau” (có cùng 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ố.

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

Xem thêm: Có Mấy Cách Đo Đại Lượng Vật Lý, Có Mấy Cách Để Đo Các Đại Lượng Vật Lí

Chúng ta đem ví dụ:

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

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

Nạp ông chồng toán tử

Nạp chồng toán tử (Operator Overloading) được dùng làm định nghĩa toán tử cho tất cả sẵn vào c++ ship hàng cho tài liệu riêng do chúng ta tạo ra.

Giả sử tất cả lớpPhanSovà có những phương thức giám sát và đo lường như Cong, Tru, Nhan, Chia.Nếu chạm chán một biểu thức phức tạp, số lượng phép tính những thì việc sử dụng các phương thức trên khá trở ngại và hoàn toàn có thể gây rối cho người lập trình. Chính vì thế ta đang nạp ông chồng lại các toán tử để hoàn toàn có thể tạo một chiếc nhìn trực quan vào code, bớ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ử tất yêu 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;// đắm đuối 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 bỏ ra tiet cua box 2 Box2.setChieuDai(7); Box2.setChieuRong(6); Box2.setChieuCao(9); // the tich cua box 1 thetich = Box1.tinhTheTich(); cout sau khi chạy chương trình mang lại kết quả:

Trong ví dụ trên, ta đang nạp chồng lại toán tử cộng. Tính nhiều hình được biểu đạt qua việc nạp ông xã để tính tổng Box1 và Box2.

2. Runtime Polymorphism:

Các bàn còn nhớ ví dụ đầu tiên của bài xích 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 thủ tục show() của lớp Mayvitinh, nhưng mà không call tới thủ tục show() của lớp mayAcer.

Vậy để chương trình gọi tới cách làm show() của lớp mayAcer ta áp dụng 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ụ trên tôi đã 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 trường đoản cú khóavirtualnghĩa là hàm này sẽ tiến hành gọi theo loại đối tượng người sử dụng được trỏ (hoặc tham chiếu), chứ chưa phải theo các 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ẽ call hàm tại lớp cở sởNếu cần sử dụng hàm ảovirtualtrình biên dịch sẽ call hàm trên lớp dẫn xuất

Khi nhận thấy có khai báovirtualtrong lớp cơ sở, trình biên dịch sẽ sản xuất mỗi đối tượng của lớp đại lý và các lớp dẫn xuất của chính nó một bé trỏ chỉ mang lại bảng cách thức ảo (virtual function table). Con trỏ đó có tên là vptr (virtual pointer). Bảng thủ tục ảo là nơi chứa những con trỏ chỉ cho đoạn lịch trình đã biên dịch ứng với những phương thức ảo. Từng lớp bao gồm một bảng cách làm ảo. Trình biên dịch chỉ lập bảng thủ tục ảo khi ban đầu có câu hỏi tạo đối tượng người sử dụng của lớp. Đến khi lịch trình chạy, cách tiến hành ảo của đối tượng mới được nối kết cùng 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 bản thân mình đến đây là kết thúc, họ đã được mày mò các khái niệm xoay xung quanh OOP trong C++ và phần nhiều tính chất đặc biệt quan trọng của nó. Bản thân hy vọng bài viết của mình sẽ một trong những phần giúp những ban trong việc học tập lập trình, nhất là tìm gọi về OOP.

Xem thêm: Cách Sửa Lỗi Gõ Dấu Ngoặc Kép Trong Word 2010, 2013, 2016, 2019

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