Đề XuấT, 2024

Editor Choice

Sự khác biệt giữa quá tải chức năng và ghi đè trong C ++

Đa hình là một trong những tính năng quan trọng của OOP. Nó đơn giản có nghĩa là "sử dụng một tên cho nhiều hình thức". Đa hình có thể được thực hiện bằng cách sử dụng 'nạp chồng hàm', 'quá tải toán tử' và 'hàm ảo'. Cả hai, 'quá tải' và 'ghi đè' đều hàm ý khái niệm đa hình. Ở đây, 'quá tải' là đa hình thời gian biên dịch và 'ghi đè' là đa hình thời gian chạy. Nghiên cứu thêm, nếu chúng ta nói về sự khác biệt lớn trong 'quá tải' và 'ghi đè'. Trong 'quá tải', chúng tôi xác định lại các hàm bị quá tải có cùng tên hàm nhưng, số lượng và loại tham số khác nhau. Trong nguyên mẫu 'ghi đè' của chức năng ghi đè là giống nhau trong suốt chương trình, nhưng chức năng bị ghi đè được bắt đầu bằng từ khóa 'ảo' trong lớp cơ sở và được xác định lại bởi lớp dẫn xuất mà không có từ khóa nào.

Hơn nữa, chúng tôi nghiên cứu sự khác biệt giữa quá tải và ghi đè với sự trợ giúp của biểu đồ so sánh.


Biểu đồ so sánh:

Cơ sở để so sánhQuá tảiGhi đè
Nguyên mẫuNguyên mẫu khác nhau như số lượng hoặc loại tham số có thể khác nhau.Tất cả các khía cạnh của nguyên mẫu phải giống nhau.
Từ khóaKhông có từ khóa được áp dụng trong quá tải.Hàm bị ghi đè được đi trước bởi từ khóa 'ảo', trong lớp cơ sở.
Yếu tố phân biệtSố lượng hoặc loại tham số khác nhau xác định phiên bản của chức năng đang được gọi.Hàm nào của lớp đang được gọi bởi con trỏ, được xác định bởi, địa chỉ của đối tượng của lớp được gán cho con trỏ đó.
Xác định mẫuHàm được định nghĩa lại với cùng tên, nhưng số lượng và loại tham số khác nhau.Hàm được định nghĩa, trước một từ khóa 'ảo' trong lớp chính và được định nghĩa lại bởi lớp dẫn xuất với từ khóa out.
Thời gian hoàn thànhThời gian biên dịch.Thời gian chạy.
Hàm xây dựng / Hàm ảoNhà xây dựng có thể bị quá tải.Chức năng ảo có thể bị ghi đè.
Phá hủy
Destructor không thể bị quá tải.Kẻ hủy diệt có thể bị ghi đè.
Ràng buộcQuá tải đạt được ràng buộc sớm.Ghi đè đề cập đến ràng buộc muộn.

Định nghĩa quá tải

Đa hình thời gian biên dịch được gọi là 'quá tải.' Do quá tải được tạo ra từ một khái niệm về đa hình, nó cung cấp cho giao diện chung cho nhiều phương thức. Điều đó có nghĩa là, nếu một hàm bị quá tải, nó chứa cùng tên hàm trong khi nó được xác định lại.

Các hàm quá tải khác nhau về 'số lượng hoặc loại tham số' khác nhau, nó làm cho một hàm bị quá tải khác biệt với một hàm khác. Theo cách này, trình biên dịch nhận ra hàm quá tải nào đang được gọi. Các hàm thường bị quá tải nhất là 'constructor'. 'Sao chép công cụ xây dựng' là một loại công cụ xây dựng quá tải.

Triển khai quá tải trong C ++

 quá tải lớp {int a, b; công khai: int load (int x) {// hàm tải đầu tiên () a = x; trả lại a; } int load (int x, int y) {// chức năng tải thứ hai () a = x; b = y; trả lại a * b; }}; int main () {quá tải O1; O1.load (20); // Hàm load () đầu tiên gọi O1.load (20, 40); // gọi hàm load () thứ hai} 

Ở đây, hàm tải () của lớp quá tải đã bị quá tải. Hai hàm quá tải của lớp có thể được phân biệt theo cách mà hàm load () đầu tiên chỉ chấp nhận tham số nguyên duy nhất, trong khi hàm load () thứ hai chấp nhận hai tham số nguyên. Khi đối tượng của lớp quá tải gọi hàm load () với một tham số duy nhất, hàm load () đầu tiên được gọi. Khi đối tượng gọi hàm load () truyền hai tham số, hàm load () thứ hai sẽ được gọi.

Định nghĩa ghi đè

Đa hình đạt được trong thời gian chạy được gọi là 'ghi đè.' Nó được thực hiện bằng cách sử dụng 'thừa kế' và 'hàm ảo'. Hàm bị ghi đè được bắt đầu bằng từ khóa 'ảo' trong lớp cơ sở và được xác định lại trong lớp dẫn xuất mà không có bất kỳ từ khóa nào.

Một trong những điều quan trọng nhất cần nhớ trong trường hợp ghi đè là nguyên mẫu của hàm bị ghi đè không được thay đổi trong khi lớp dẫn xuất xác định lại nó. Khi chức năng ghi đè được đưa ra một cuộc gọi, C ++ xác định phiên bản nào của chức năng được gọi dựa trên 'loại đối tượng được trỏ bởi một con trỏ' mà qua đó chức năng gọi được thực hiện.

Triển khai ghi đè trong C ++

 lớp cơ sở {công khai: virtual void func () {// hàm ảo của cout lớp cơ sở << "Đây là func ()" của lớp cơ sở; }}; class origin1: public base {public: void func () {// hàm ảo của lớp cơ sở được định nghĩa lại trong cout class1 << "Đây là func ()" của lớp Der1; }}; class origin2: public base {public: void func () {// hàm ảo của lớp cơ sở được định nghĩa lại trong cout class2  func (); // gọi tới lớp f1 (). * p = & d2; p-> func (); // gọi hàm phái sinh lớp 2 (). trả về 0; } 

Ở đây, có một lớp cơ sở duy nhất được kế thừa công khai bởi hai lớp dẫn xuất. Một hàm ảo được định nghĩa trong một lớp cơ sở với từ khóa 'ảo' và nó được định nghĩa lại bởi cả hai lớp dẫn xuất không có từ khóa. Trong hàm main (), lớp cơ sở tạo ra một biến con trỏ 'p' và một đối tượng 'b'; 'Der1 ′ class tạo một đối tượng d1 và lớp Der2 tạo ra một đối tượng d2'.

Bây giờ, ban đầu địa chỉ của đối tượng của lớp cơ sở 'b' được gán cho con trỏ của lớp cơ sở 'p'. 'p' đưa ra một cuộc gọi đến hàm func (), do đó, một hàm của lớp cơ sở được gọi. Sau đó, địa chỉ của đối tượng lớp dẫn xuất 'd1' được gán cho con trỏ 'p', một lần nữa, nó đưa ra lệnh gọi tới func (); ở đây hàm func () của lớp origin1 được thực thi. Cuối cùng, con trỏ 'p' được gán cho đối tượng của lớp phái2. Sau đó, 'p' gọi hàm func () thực thi hàm func () của lớp origin2.

Nếu lớp Der1 / origin2 không định nghĩa lại func (), thì func () của lớp cơ sở sẽ được gọi, vì hàm ảo là 'phân cấp.'

Sự khác biệt chính giữa quá tải và ghi đè

  1. Nguyên mẫu của một hàm đang bị quá tải khác nhau do loại và số lượng tham số được truyền cho hàm bị quá tải. Mặt khác, nguyên mẫu của hàm bị ghi đè không thay đổi vì hàm bị ghi đè thực hiện hành động khác nhau cho lớp khác nhau nhưng nó thuộc cùng một loại và số lượng tham số.
  2. Tên hàm bị quá tải không đứng trước bất kỳ từ khóa nào trong khi đó, tên của hàm bị ghi đè đứng trước với keyord Hồi Virtual ảo chỉ trong lớp cơ sở.
  3. Hàm quá tải nào được gọi phụ thuộc vào loại hoặc số lượng tham số được truyền cho hàm. Hàm được ghi đè của lớp nào được gọi phụ thuộc vào, địa chỉ đối tượng của lớp được gán cho con trỏ, gọi hàm đó.
  4. Hàm quá tải nào sẽ được gọi được giải quyết trong thời gian biên dịch. Hàm ghi đè nào được gọi sẽ được giải quyết trong thời gian chạy.
  5. Các nhà xây dựng có thể bị quá tải nhưng không thể bị ghi đè.
  6. Phá hủy không thể bị quá tải, nhưng chúng có thể bị ghi đè.
  7. Quá tải đạt được ràng buộc sớm vì chức năng quá tải sẽ được gọi được giải quyết trong thời gian biên dịch. Ghi đè đạt được ràng buộc muộn vì chức năng ghi đè sẽ được gọi được giải quyết trong thời gian chạy.

Điểm tương đồng

  1. Cả hai đều được áp dụng cho các chức năng thành viên của một lớp.
  2. Đa hình là khái niệm cơ bản đằng sau cả hai.
  3. Tên hàm vẫn giữ nguyên trong khi chúng ta áp dụng quá tải và ghi đè lên các hàm.

Phần kết luận

Quá tải và ghi đè xuất hiện tương tự, nhưng đây không phải là trường hợp. Các hàm có thể bị quá tải nhưng, bất kỳ lớp nào cũng không thể xác định lại hàm quá tải trong tương lai. Một chức năng ảo không thể bị quá tải; họ chỉ có thể bị ghi đè.

Top