Tính Đa Hình Trong Oop

     

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

Bạn đang xem: Tính đa hình trong oop

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

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

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

Ví dụ:Lớp mayAcer thừa kế từ lớp Mayvitinh, cả nhì lớp này mọi định nghĩa phương thức show()

class Mayvitinh{ public: void show(){ cout lúc đó, trường hợp ta khai báo một con trỏ lớp mayAcer, nhưng lại lại trỏ vào add 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ẽ hotline đến phương thức show() của lớp Mayvitinh, mà không gọi tới cách làm show() của lớp mayAcer.Để giải quyết và xử lý vấn đề này, chúng ta cần sử dụng đến tính nhiều hình trong Lập trình phía đối tượng. Mình sẽ giải thích chi tiết hơn ở mặt dưới.

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

Mình mang một ví dụ thực rứa nhé:Một bạn cùng một lúc hoàn toàn có thể có đặc điểm khác nhau. Y hệt như một người bầy học sinh thời là một người nhỏ trai, một người bạn, một người anh. Vày vậy, cùng một tín đồ sở hữu phần lớn hành vi khác biệt trong các trường hợp khác nhau. Điều này được hotline là đa hình.

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

Các một số loại đa hình:

Tính nhiều hình hầu hết được phân thành hai loại:

Compile time Polymorphism.Runtime Polymorphism.

*

1. Compile time Polymorphism:

Tính nhiều 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 ông xã hàm và nạp ông chồng toán tử là gì?

Nạp ông chồng hàm

Nạp 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ó cùng mục đích). Nhưng khác biệt về kiểu dữ liệu tham số hoặc số lượng tham số.

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

Xem thêm: Đặt Tên Con Trai Hay Và Độc

Chúng ta lấy 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 lấy ví dụ trên, ta chỉ dùng một hàm duy nhất có tên làhamIn()nhưng có thể dùng được đến 3 trường hợp khác nhau. Đây là 1 trong thể hiện tại của tính nhiều hình.

Nạp ông xã toán tử

Nạp ông 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 các bạn tạo ra.

Giả sử có lớpPhanSovà có các phương thức giám sát và đo lường 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 các thì việc sử dụng những phương thức trên khá trở ngại và rất có thể gây rối cho tất cả những người lập trình. Vì thế ta vẫn nạp chồng lại những toán tử để hoàn toàn có thể tạo một cái 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ử rất có thể nạp chồng

*

Các toán tử thiế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 dẻo ) 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 dẻo cua mot box double chieurong; // Chieu rong cua mot box double chieucao; // Chieu cao cua mot box;// si 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 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 khoản thời gian chạy chương trình mang đến kết quả:

Trong lấy ví dụ như trên, ta vẫn nạp chồng lại toán tử cộng. Tính đa hình được mô tả qua vấn đề nạp chồng để tính tổng Box1 và Box2.

2. Runtime Polymorphism:

Các bàn còn ghi nhớ ví dụ thứ nhất 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 thức show() của lớp Mayvitinh, nhưng không call tới cách tiến hành show() của lớp mayAcer.

Vậy để chương trình hotline tới cách 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ẽ có kết quả:

Trong ví dụ trên tôi đã thêm từ bỏ 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ừ bỏ khóavirtualnghĩa là hàm này sẽ tiến hành 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 một số loại của bé trỏ (hoặc tham chiếu). Và vấn đề đó 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ẽ điện thoại tư vấn hàm tại lớp cở sởNếu cần sử dụng hàm ảovirtualtrình biên dịch sẽ gọi hàm trên lớp dẫn xuất

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

Xem thêm: Cấu Trúc, Các Giới Từ Đi Với Make, Giỏi Ngay Cấu Trúc Make Trong 5 Phút

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