Làm thế nào để triển khai hàm ảo trong C ++?



Bài viết này sẽ giới thiệu cho bạn một khái niệm lập trình khác đó là Hàm ảo trong C ++. Khái niệm sẽ được hỗ trợ bởi trình diễn.

Một chức năng ảo trong C ++ là một hàm thành viên trong lớp cơ sở mà chúng tôi định nghĩa lại trong một lớp dẫn xuất. Bài viết này sẽ giúp bạn khám phá khái niệm một cách chi tiết. Những điểm sau sẽ được đề cập trong bài viết này,

Vì vậy, chúng ta hãy bắt đầu với bài viết này về Hàm ảo trong C ++





Chức năng ảo là gì?

Một hàm ảo là một hàm thành viên trong lớp cơ sở mà chúng ta định nghĩa lại trong một lớp dẫn xuất. Nó được khai báo bằng từ khóa ảo. Khi một lớp chứa hàm ảo được kế thừa, lớp dẫn xuất xác định lại hàm ảo cho phù hợp với nhu cầu của chính nó.

Tiếp tục với bài viết này về Hàm ảo trong C ++



Quy tắc cho hàm ảo trong C ++:

  • Chúng luôn được định nghĩa trong một lớp cơ sở và được ghi đè trong lớp dẫn xuất nhưng không bắt buộc phải ghi đè trong lớp dẫn xuất.
  • Các hàm ảo phải được khai báo trong phần công khai của lớp.
  • Chúng không thể là hàm tĩnh hoặc hàm bạn bè cũng không thể là hàm ảo của lớp khác.
  • Các chức năng ảo nên được truy cập bằng cách sử dụng một con trỏ để đạt được tính đa hình thời gian chạy.

Tiếp tục với bài viết này về Hàm ảo trong C ++.

c ++ đi tới

Ràng buộc là gì?

Ràng buộc đối với các hàm có nghĩa là bất cứ nơi nào có lệnh gọi hàm, trình biên dịch cần biết định nghĩa hàm nào nên được khớp với. Điều này phụ thuộc vào chữ ký của từng khai báo chức năng và các nhiệm vụ được thực hiện. Ngoài ra, trình biên dịch cần biết rằng khi sự phù hợp này giữa lệnh gọi hàm và việc chọn định nghĩa đúng sẽ xảy ra.

Tiếp tục với bài viết này về Hàm ảo trong C ++



Ràng buộc sớm

Liên kết sớm là một hiện tượng trong đó quyết định khớp các lệnh gọi hàm khác nhau xảy ra tại chính thời gian biên dịch và trình biên dịch liên kết trực tiếp liên kết với các địa chỉ. Nó còn được gọi là Ràng buộc tĩnh hoặc Ràng buộc thời gian biên dịch.

  • Như chúng ta biết, chúng ta viết mã bằng ngôn ngữ cấp cao
  • Sau đó, trình biên dịch chuyển đổi ngôn ngữ này thành ngôn ngữ cấp thấp mà máy tính có thể hiểu được, chủ yếu là ngôn ngữ máy tại thời điểm biên dịch
  • Trong liên kết ban đầu, trình biên dịch cung cấp trực tiếp địa chỉ của lệnh khai báo hàm cho lệnh gọi hàm
  • Vì vậy, như tên cho thấy ràng buộc xảy ra rất sớm trước khi chương trình chạy.

Thí dụ

#include using namespace std class Animals {public: void sound () {cout<< 'Genric animal sound' << endl } } class Cats: public Animals { public: void sound() { cout << 'Cat meow' <sound () // trả về liên kết sớm 0}

Đầu ra

Output- Hàm ảo trong C ++ - Edureka

làm rõ ion
Trong ví dụ này, chúng tôi đã tạo một con trỏ a tới lớp cha Animals. Sau đó, bằng cách viết a = & c, con trỏ ‘a’ bắt đầu tham chiếu đến đối tượng c của lớp Cats.
a -> sound () - Khi gọi hàm sound () có trong cả hai lớp bằng con trỏ 'a', hàm của lớp cha được gọi, ngay cả khi con trỏ đang tham chiếu đến đối tượng của lớp Cats .

Điều này là do Ràng buộc sớm. Chúng ta biết rằng ‘a’ là một con trỏ của lớp cha tham chiếu đến đối tượng của lớp con. Vì liên kết ban đầu diễn ra tại thời điểm biên dịch, do đó khi trình biên dịch thấy rằng 'a' là một con trỏ của lớp cha, nó khớp lệnh gọi với hàm 'sound ()' của lớp cha mà không cần tìm kiếm đối tượng con trỏ nó. đang đề cập đến.

Tiếp tục với bài viết này về Hàm ảo trong C ++

Ràng buộc muộn

Trong liên kết muộn, trình biên dịch xác định đối tượng trong thời gian chạy và sau đó khớp lệnh gọi hàm với hàm đúng. Nó còn được gọi là Runtime Binding hoặc Runtime Binding.

Ràng buộc muộn trong vấn đề trên có thể được giải quyết bằng cách sử dụng từ khóa ảo trong lớp cơ sở. Hãy xem điều này xảy ra như thế nào bằng cách sử dụng chính ví dụ trên, nhưng chỉ thêm từ khóa ảo.

Thí dụ

#include using namespace std class Animals {public: virtual void sound () {cout<< 'Genric aniaml sound' << endl } } class Cats: public Animals { public: void sound() { cout << 'Cats meow' <sound () return 0}

Đầu ra

Giải trình
Ở đây hàm sound () của lớp cơ sở được tạo ảo, do đó trình biên dịch bây giờ thực hiện liên kết trễ cho hàm này. Bây giờ, lệnh gọi hàm của hàm sound () sẽ được khớp với định nghĩa hàm trong thời gian chạy. Vì trình biên dịch bây giờ xác định con trỏ ‘a’ là tham chiếu đến đối tượng ‘c’ của lớp dẫn xuất Cats, nó sẽ gọi hàm sound () của lớp Cats.

Tiếp tục với bài viết này về Hàm ảo trong C ++

Chức năng ảo thuần túy

Một hàm ảo thuần túy trong C ++ là một hàm ảo mà chúng tôi không có triển khai, chúng tôi chỉ khai báo nó. Một hàm ảo thuần túy được khai báo bằng cách gán 0 trong khai báo.

âm thanh khoảng trống ảo () = 0

Ở đây âm thanh () là một cảm biến ảo thuần túy.

Tiếp tục với bài viết này về Hàm ảo trong C ++

Lớp trừu tượng

Một lớp trừu tượng được định nghĩa là một lớp có một hoặc nhiều hàm ảo thuần túy. Như đã giải thích ở trên, hàm thuần ảo là một hàm thành viên ảo được đánh dấu là không có triển khai. Nó không thể thực hiện được với thông tin được cung cấp trong lớp, bao gồm bất kỳ lớp cơ sở nào. Một lớp trừu tượng còn được gọi là một lớp cơ sở trừu tượng.

Thí dụ

#include using namespace std class Employee // abstract base class {virtual int getSalary () = 0 // pure virtual function} class Employee_1: public Employee {int lương public: Employee_1 (int s) {Lương = s} int getSalary () {return lương}} class Employee_2: public Employee {int lương public: Employee_2 (int t) {Lương = t} int getSalary () {return lương}} int main () {Employee_1 e1 (5000) Employee_2 e2 (3000) int a, ba = e1.getSalary () b = e2.getSalary () cout<< 'Salary of Developer : ' << a << endl cout << 'Salary of Driver : ' << b << endl return 0 } 

Đầu ra

khoa học dữ liệu được sử dụng để làm gì

Giải trình
Hàm ‘getSalary ()’ trong lớp Employee là một hàm ảo thuần túy. Vì lớp Employee chứa hàm ảo thuần túy, do đó nó là một lớp cơ sở trừu tượng.
Vì hàm ảo thuần túy được định nghĩa trong các lớp con, do đó hàm ‘getSalary ()’ được định nghĩa trong cả hai lớp con của lớp Employee, tức là trong Employee_1 và Employee_2.

Tiếp tục với bài viết này về Hàm ảo trong C ++

Ví dụ cho chức năng ảo

#include using namespace std class base {public: void function_1 () {cout<< 'base class function 1n' } virtual void function_2() { cout << 'base class function 2n' } virtual void function_3() { cout << 'base class function 3n' } virtual void function_4() { cout << 'base class function 4n' } } class derived : public base { public: void function_1() { cout << 'derived class function 1n' } void function_2() { cout << 'derived class function 2n' } void function_4(int x) { cout function_2 () ptr-> function_3 () ptr-> function_4 ()}

Đầu ra

Giải trình
Đối với lời gọi hàm function_1 (), phiên bản lớp cơ sở của hàm được gọi, hàm_2 () được ghi đè trong lớp dẫn xuất để phiên bản lớp dẫn xuất được gọi, hàm_3 () không bị ghi đè trong lớp dẫn xuất và là hàm ảo nên phiên bản lớp cơ sở được gọi, tương tự function_4 () không bị ghi đè nên phiên bản lớp cơ sở được gọi.

Như vậy chúng ta đã kết thúc bài viết này về 'Hàm ảo trong C ++'. Nếu bạn muốn tìm hiểu thêm, hãy xem bởi Edureka, một công ty học trực tuyến đáng tin cậy. Khóa đào tạo và cấp chứng chỉ Java J2EE và SOA của Edureka được thiết kế để đào tạo bạn về cả khái niệm Java cốt lõi và nâng cao cùng với các khung công tác Java khác nhau như Hibernate & Spring.

Có một câu hỏi cho chúng tôi? Vui lòng đề cập đến nó trong phần nhận xét của blog này và chúng tôi sẽ liên hệ lại với bạn trong thời gian sớm nhất.