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

Tác Giả: Laura McKinney
Ngày Sáng TạO: 1 Tháng Tư 2021
CậP NhậT Ngày Tháng: 10 Có Thể 2024
Anonim
Sự khác biệt giữa quá tải chức năng và ghi đè trong C ++ - Công Nghệ
Sự khác biệt giữa quá tải chức năng và ghi đè trong C ++ - Công Nghệ

NộI Dung


Trong 'quá tảiChúng tôi xác định lại các hàm bị quá tải với cùng tên hàm nhưng, số lượng và loại tham số khác nhau. Trong 'ghi đè‘Nguyên mẫu 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 đi trước bởi 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ó bất kỳ từ khóa nào.

Đ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 overload chức năng nạp chồng, ’toán tử nạp chồng và’ hàm ảo. Cả hai, ‘quá tải, và over ghi đè lên ngụ ý khái niệm đa hình. Ở đây, ‘nạp chồng là đa hình thời gian và‘ ghi đè lên là đa hình thời gian. Nghiên cứu sâu hơn, nếu chúng ta nói về sự khác biệt lớn trong quá tải và ‘ghi đè lên.


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.

  1. Biểu đồ so sánh
  2. Định nghĩa
  3. Sự khác biệt chính
  4. Điểm tương đồng
  5. Phần kết luận


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 lớp nào đang được gọi bởi con trỏ, được xác định bởi, địa chỉ của đối tượng lớp nào đượ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.Chạy thời gian.
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

Tính đa hình thời gian biên dịch được gọi là ‘quá tải. Hiện tại, quá tải được tạo ra từ một khái niệm về đa hình, nó cung cấp một 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ố or hoặc loại tham số khác nhau, nó làm cho một hàm 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 chức năng thường bị quá tải nhất là ‘constructor. Sao chép constructor, là một loại constructor 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) {// hàm 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 đè

Tính đa hình đạt được trong thời gian chạy được gọi là ‘ghi đè. Hiện tại, nó được thực hiện bằng cách sử dụng‘ thừa kế và các hàm ảo. Hàm bị ghi đè được đi trước bởi từ khóa ‘ảo trong một lớp cơ sở và được định nghĩa 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 of của đối tượng được trỏ bởi một con trỏ, theo đó việc gọi chức năng đượ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à lớp cơ sở func ()"; }}; 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à một lớp Der1 lớp func ()"; }}; 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 << "Đây là một lớp phái sinh func ()"; }}; int main () {cơ sở * p, b; dẫn xuất1 d1; dẫn xuất2 d2; * p = & b; p-> func (); // gọi tới lớp cơ sở func (). * p = & d1; p-> func (); // gọi tới lớp phái f1 (). * p = & d2; p-> func (); // gọi tới lớp phái sinh func (). 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 một 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 lớp cơ sở ‘bv được gán cho con trỏ của lớp cơ sở‘ p. ’Pv đư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ất1 d11 đượ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ỏ ‘pv được gán cho đối tượng lớp phái phái2. Sau đó, ’p Gọi hàm func () thực thi hàm func () của lớp Der2.

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 được phân cấp.

  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 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 các 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 của Virtual Virtual 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 lớp lớp nào được gán cho con trỏ, gọi hàm này.
  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 đè.