da hinh la gi

Trong bài bác trước, tất cả chúng ta nắm chắc thế này là tính tiếp thừa trong OOP. Tại bài bác này tất cả chúng ta tiếp tục dò xét hiểu thêm 1 đặc điểm nữa của lập trình sẵn phía đối tượng người sử dụng là tính nhiều hình nhé.

Tính nhiều hình là gì ?

Sự thừa kế vô C++ được cho phép sở hữu sự ứng thân thuộc lớp hạ tầng và những lớp dẫn xuất vô sơ vật quá kế:  

Bạn đang xem: da hinh la gi

  • Một con cái trỏ sở hữu loại lớp hạ tầng luôn luôn rất có thể trỏ cho tới vị trí của một đối tượng người sử dụng của lớp dẫn xuất. 
  • Tuy nhiên, khi tiến hành lời nói gọi một cách thức của lớp, trình biên dịch tiếp tục quan hoài cho tới loại của con cái trỏ chứ không cần nên đối tượng người sử dụng nhưng mà con cái trỏ đang được trỏ tới: cách thức của lớp nhưng mà con cái trỏ sở hữu loại được gọi chứ không cần nên cách thức của đối tượng người sử dụng nhưng mà con cái trỏ đang được trỏ cho tới được gọi. 

Ví dụ: Lớp mayAcer thừa kế kể từ lớp Mayvitinh, cả nhì lớp này đều khái niệm cách thức show()

class Mayvitinh{  
	public: 	 	 	
	void show(){
	    cout << "mayvitinh" << endl;
	}
}; 
class mayAcer: public Mayvitinh{  	
    public: 	 	 	
    void show(){
        cout << "mayAcer" << endl;
    }
}; 

khi tê liệt, nếu như tớ khai báo một con cái trỏ lớp mayAcer, tuy nhiên lại trỏ vô vị trí của một đối tượng người sử dụng lớp Mayvitinh

mayAcer may1; 
Mayvitinh *tenmay = &may1;
tenmay->show(); 

thì lịch trình tiếp tục gọi cho tới cách thức show() của lớp Mayvitinh, nhưng mà ko gọi cho tới cách thức show() của lớp mayAcer.
Để xử lý yếu tố này, tất cả chúng ta cần dùng cho tới tính nhiều hình vô Lập trình phía đối tượng người sử dụng. Mình tiếp tục lý giải cụ thể rộng lớn ở bên dưới.

Đa hình (polymorphism) nghĩa là có khá nhiều hình dáng không giống nhau. Tiêu biểu là, đa hình xuất hiện tại khi sở hữu một cấu tạo cấp độ của những lớp và bọn chúng tương quan cùng nhau vì chưng tính thừa kế.

Mình lấy ví dụ như thực thế nhé:
Một người và một khi rất có thể sở hữu điểm lưu ý không giống nhau. Giống như 1 người đàn học viên thời là một trong người đàn ông, một người các bạn, một người anh. Vì vậy, và một người chiếm hữu những hành động không giống nhau trong những trường hợp không giống nhau. Vấn đề này được gọi là đa hình.

Đa hình được xem là một trong mỗi tác dụng cần thiết của Lập trình phía đối tượng người sử dụng.

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

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

  • Compile time Polymorphism.
  • Runtime Polymorphism.

1. Compile time Polymorphism:

Tính nhiều hình này được dùng bằng phương pháp hấp thụ ông xã hàm hoặc hấp thụ ông xã toán tử.

Vậy hấp thụ ông xã hàm và hấp thụ ông xã toán tử là gì?

Nạp ông xã hàm

Nạp ông xã hàm (Function Overloading) cho quy tắc dùng và một tên thường gọi cho những hàm “giống nhau” (có nằm trong mục đích). Nhưng không giống nhau về loại tài liệu thông số hoặc con số thông số. 

Nạp ông xã hàm được cho phép tớ khai báo và khái niệm những hàm bên trên cùng theo với một tên thường gọi.

Chúng tớ lấy ví dụ:

#include <iostream>
using namespace std;
 
class inDuLieu 
{
   public:
      void hamIn(int i) {
        cout << "In ví nguyen: " << i << endl;
      }

      void hamIn(double  f) {
        cout << "In ví thuc: " << f << endl;
      }

      void hamIn(string s) {
        cout << "In chuoi: " << s << endl;
      }
};

int main(void)
{
   inDuLieu idl;
 
   // Goi ham hamIn de in ví nguyen
   idl.hamIn(1235);
   // Goi ham hamIn de in ví thuc
   idl.hamIn(67.02);
   // Goi ham hamIn de in chuoi
   idl.hamIn("Codelearn.io");
 
   return 0;
}

Biên dịch lịch trình tớ sở hữu kết quả:

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

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

Nạp ông xã toán tử (Operator Overloading) được dùng để làm khái niệm toán tử cho tới đã có sẵn trước vô c++ đáp ứng cho tới tài liệu riêng biệt tự các bạn tạo nên.

Xem thêm: hai vạn dặm dưới biển

Giả sử sở hữu lớp PhanSo và sở hữu những cách thức đo lường và tính toán như Cong, Tru, Nhan, Chia.
Nếu bắt gặp một biểu thức phức tạp, con số quy tắc tính nhiều thì việc dùng những cách thức bên trên khá trở ngại và rất có thể làm gây rối cho tất cả những người lập trình sẵn. Vì thế tớ tiếp tục hấp thụ ông xã lại những toán tử nhằm rất có thể tạo ra một chiếc coi trực quan tiền vô code, thuyên giảm những lỗi sai ko xứng đáng sở hữu.

Các toán tử rất có thể hấp thụ chồng

Các toán tử ko thể hấp thụ chồng:

Ví dụ:

#include <iostream>
using namespace std;

class Box
{
   public:

      double tinhTheTich(void)
      {
         return chieudai * chieurong * chieucao;
      }
      void setChieuDai( double mềm )
      {
          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 mềm cua mot box
      double chieurong;     // Chieu rong cua mot box
      double chieucao;      // Chieu cao cua mot box
};
// ham main cua chuong trinh
int 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 cậy chi tiet cua box 1
   Box1.setChieuDai(5); 
   Box1.setChieuRong(2); 
   Box1.setChieuCao(4);
 
   // thong tin cậy chi tiet cua box 2
   Box2.setChieuDai(7); 
   Box2.setChieuRong(6); 
   Box2.setChieuCao(9);
 
   // the tich cua box 1
   thetich = Box1.tinhTheTich();
   cout << "The tich cua Box1 la: " << thetich <<endl;
 
   // the tich cua box 2
   thetich = Box2.tinhTheTich();
   cout << "The tich cua Box2 la: " << thetich <<endl;

   // cong nhì doi tuong nhu sau:
   Box3 = Box1 + Box2;

   // the tich cua box 3
   thetich = Box3.tinhTheTich();
   cout << "The tich cua Box3 la: " << thetich <<endl;

   return 0;
}

Sau khi chạy lịch trình cho tới kết quả:

Trong ví dụ bên trên, tớ tiếp tục hấp thụ ông xã lại toán tử nằm trong. Tính nhiều hình được thể hiện tại qua loa việc hấp thụ ông xã nhằm tính tổng Box1Box2.

2. Runtime Polymorphism:

Các bàn còn lưu giữ ví dụ trước tiên của bài bác ko.

#include <iostream>
using namespace std;

class Mayvitinh{  
	public: 	 	 	
	void show(){
	    cout << "mayvitinh" << endl;
	}
}; 
class mayAcer: public Mayvitinh{  	
    public: 	 	 	
    void show(){
        cout << "mayAcer" << endl;
    }
}; 

int main(){
    mayAcer may1; 
    Mayvitinh *tenmay = &may1;
    tenmay->show(); 
}

Có thể thấy lịch trình sau thời điểm chạy sẽ gọi cho tới cách thức show() của lớp Mayvitinh, nhưng mà ko gọi cho tới cách thức show() của lớp mayAcer.

Vậy nhằm lịch trình gọi cho tới cách thức show() của lớp mayAcer tớ dùng hàm ảo virtual như sau:

#include <iostream>
using namespace std;

class Mayvitinh{  
	public: 	 	 	
	virtual void show(){
	    cout << "mayvitinh" << endl;
	}
}; 
class mayAcer: public Mayvitinh{  	
    public: 	 	 	
    void show(){
        cout << "mayAcer" << endl;
    }
}; 

int main(){
    mayAcer may1; 
    Mayvitinh *tenmay = &may1;
    tenmay->show(); 
}

Sau khi biên dịch lịch trình sẽ sở hữu kết quả:

Trong ví dụ bên trên tôi đã tăng kể từ khóa virtual vào hàm show() trong lớp cơ sở Mayvitinh.
Từ khóa virtual nà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 kể từ khóa virtual nghĩa là hàm này sẽ tiến hành gọi theo dõi loại đối tượng người sử dụng được trỏ (hoặc tham ô chiếu), chứ không cần nên theo dõi loại của con cái trỏ (hoặc tham ô chiếu). Và điều này kéo theo thành quả không giống nhau:

Xem thêm: dẫn sói vào nhà full

  • Nếu ko khai báo hàm ảo virtual trình biên dịch tiếp tục gọi hàm bên trên lớp cở sở
  • Nếu người sử dụng hàm ảo virtual trình biên dịch tiếp tục gọi hàm bên trên lớp dẫn xuất

Khi nhận biết sở hữu khai báo virtual trong lớp hạ tầng, trình biên dịch tiếp tục thêm vô từng đối tượng người sử dụng của lớp hạ tầng và những lớp dẫn xuất của chính nó một con cái trỏ chỉ cho tới bảng cách thức ảo (virtual function table). Con trỏ tê liệt mang tên là vptr (virtual pointer). Bảng cách thức ảo là điểm chứa chấp những con cái trỏ chỉ cho tới đoạn lịch trình tiếp tục biên dịch ứng với những cách thức ảo. Mỗi lớp sở hữu một bảng cách thức ảo. Trình biên dịch chỉ lập bảng cách thức ảo khi chính thức sở hữu việc tạo ra đối tượng người sử dụng của lớp. Đến khi lịch trình chạy, cách thức ảo của đối tượng người sử dụng vừa được nối kết và thực hiện trải qua con cái trỏ vptr.

Kết

Vậy là series Lập trình phía đối tượng người sử dụng của tôi cho tới đó là kết đôn đốc, tất cả chúng ta đã và đang được dò xét hiểu những định nghĩa xoay xung quanh OOP vô C++ và những đặc điểm cần thiết của chính nó. Mình kỳ vọng nội dung bài viết của tôi tiếp tục 1 phần canh ty những ban trong các việc học hành lập trình sẵn, nhất là dò xét hiểu về OOP.

Nếu chúng ta sở hữu vướng mắc hoặc thắc mắc gì rất có thể comment và rate bên dưới nội dung bài viết. Mình kỳ vọng tiếp tục có được sự cỗ vũ của chúng ta trong mỗi bài bác không giống với chủ thể không giống.