Virtual function (Hàm ảo), override và final

Chúng tôi rất vui mừng chia sẻ kiến thức về từ khóa Virtual trong c la gi và hi vọng rằng nó sẽ hữu ích cho các bạn đọc. Bài viết tập trung trình bày ý nghĩa, vai trò và ứng dụng của từ khóa trong việc tối ưu hóa nội dung trang web và chiến dịch tiếp thị trực tuyến. Chúng tôi cung cấp các phương pháp tìm kiếm, phân tích và chọn lọc từ khóa phù hợp, kèm theo các chiến lược và công cụ hữu ích. Hi vọng rằng thông tin chúng tôi chia sẻ sẽ giúp bạn xây dựng chiến lược thành công và thu hút lưu lượng người dùng. Cảm ơn sự quan tâm và hãy tiếp tục theo dõi blog của chúng tôi để cập nhật kiến thức mới nhất.

Virtual function (hàm ảo)

Virtual function giống như một hàm quá tải, nhưng điều đặc biệt quan trọng ở đây là: kiểu tài liệu, số lượng và kiểu tài liệu của không ít thông số của hàm ảo ở cả hai lớp cơ sở và dẫn xuất đều như nhau ! Hàm ảo là thành phần của một lớp, được khai báo trong lớp cơ sở rồi nhưng lại được khai báo lại trong lớp dẫn xuất với từ khoá “virtual” ở đằng trước. Không phải tự dưng người ta làm điều này vô ích, hàm ảo tạo nên tính đa hình trong c++ là bởi vì diễn giải theo ý nghĩa khác một “giao diện” cho nhiều phương thức. Có tức thị với một thông điệp đó thôi mà cho nhiều kết quả khác nhau khi con trỏ của lớp cơ sở trỏ đến đối tượng người dùng của một lớp nào đó (không nói đến con trỏ của lớp dẫn xuất vì nó không thể trỏ đến đối tượng người dùng của lớp cơ sở được !).

Bạn Đang Xem: Virtual function (Hàm ảo), override và final

Để khai báo hàm ảo, bạn thêm từ khóa virtual trước tên hàm. Hãy theo dõi ví dụ minh họa sau để hiểu hơn cách hàm ảo thao tác làm việc.

Ví dụ:

#includevàlt;iostreamvàgt; #includevàlt;conio.hvàgt; using namespace std; class sun { public: virtual void showcty() { coutvàlt;<“n Hien thi sun:”; } void display() { coutvàlt;<“n Trung bay sun:” ; } }; class kethua:public sun { public: void display() { coutvàlt;<“n Trung bay sun1:”; } void showcty() { coutvàlt;<“n Hien thi sun1:”; } }; int main() { sun obj1; sun *p; coutvàlt;<“n Phường tro toi sun:n” ; p=&obj1; p->display(); p->showcty(); coutvàlt;<“nn Phường tro toi sun1:n”; kethua obj2; p=&obj2; p->display(); p->showcty(); return 0; }

Kết quả:

Phường tro toi sun: Trung bay sun: Hien thi sun: Phường tro toi sun1: Trung bay sun: Hien thi sun1:

Lưu ý:

Còn một điều đáng lưu ý nữa, hàm ảo này còn có thể không được khái niệm trong lớp cơ sở mà chỉ được khai báo thôi! VD: virtual void setsun(int i)=0. Lúc này tất cả chúng ta gọi nó là “hàm ảo thuần tuý”.

Xem Thêm : Phân biệt cách dùng cấu trúc ngữ pháp A lot of, Lots of, A lot chi tiết nhất

Ví dụ tiếp theo:

#include <iostreamvàgt; using namespace std; class Sun { public: ~Sun() { cout << “This is Sun*” << endl; } }; class Sun1 : public Sun { public : ~Sun1() { cout << “This is Sun1” << endl; } }; int main() { Sun* sun = new Sun1(); delete sun; return 0; }

Kết quả:

This is Sun*

Ở ví dụ trên hàm hủy của Sunclass không được khái niệm là virtual nên những khi ta hủy con trỏ sun hàm hủy của Sun1 không được gọi. Nên ta khái niệm hàm hủy của Sun class là virtual.

Override và final

Override là việc viết lại một phương thức (method) trong lớp dẫn xuất (derived class) mà ở lớp cơ sở (base class).

Như tất cả chúng ta đã biết để lớp dẫn suất override 1 virtual function của base class thì 2 hàm phải có cùng tên, cùng thông số và cùng kiểu tài liệu trả về. Tuy nhiên trong nhiều trường hợp ta có thể xẩy ra nhầm lẫn khi override 1 virtual function.

Ví dụ:

class Sun { public: virtual void Thongtin() { cout << “Day la ham thong tin cty SUN” << endl; } }; class CSun1 : public Sun { public: void Thongtin() const { cout << “Day la ham thong tin nhan vien Sun” << endl; } };

Xem Thêm : Hooligan là gì? Giải mã tâm lý “hooligan” của các cổ động viên bóng đá

Trong ví dụ trên hàm CSun1::Thongtin khong co override hàm Sun::Thongtin vì hàm CSun1::Thongtin là const còn hàm Sun::Thongtin thì không phải.

Trong phiên bản C++11 có tương trợ thêm một từ khóa là override, ý nghĩa của từ khóa này sẽ giúp ta kiểm soát việc một hàm có thật sự là override một phương thức của lớp mà nó đang thừa hưởng hay là không, nếu không tồn tại phương thức mà nó đang “nghĩ” rằng nó đang override tại lớp mà nó thừa hưởng thì trình biên dịch sẽ báo lỗi khi biên dịch. Ta thêm từ khóa override vào thời gian cuối tên phương thức như sau.

class Sun { public: char* getThongtinsun(int sign) { if (sign > 0) { return “Sun”; } } }; class CSun1: public Sun { public: char* getThongtinsun(char sign) override { if (sign > 0) { return “CSun1”; } } };

Trong nhiều trường hợp ta không muốn lớp dẫn suất override 1 virtual function trong base class. C++ 11 cung cấp cho ta từ khóa final để thực hiện điều này. Virtual function được lưu lại là final sẽ không còn được cho phép override ở lớp dẫn suất. Nếu lớp dẫn suất vẫn override thì trình biên dịch sẽ báo lỗi.

Ví dụ :

class Sun { public: virtual void Thongtin() final { cout << “Day la ham thong tin cty Sun” << endl; } }; class CSun1 : public Sun { public: //Error void Thongtin() override { cout << “Day la ham thong tin nhan vien Sun” << endl; } };

Trên đây là 1 trong số tìm hiểu của tôi về Virtual function, override và final cảm ơn các bạn đã đọc.

Link tham khảo:

https://deepcpp.com/

https://kipalog.com/posts/Tu-khoa-virtual-trong-C-702eb516-7ea6-472c-a812-42c0733d6c33

You May Also Like

About the Author: v1000

tỷ lệ kèo trực tuyến manclub 789club