Từ Khoá Virtual Trong C++

Cập nhật thông tin chi tiết về Từ Khoá Virtual Trong C++ mới nhất ngày 28/09/2020 trên website Doisonggiaitri.com. Hy vọng nội dung bài viết sẽ đáp ứng được nhu cầu của bạn, chúng tôi sẽ thường xuyên cập nhật mới nội dung để bạn nhận được thông tin nhanh chóng và chính xác nhất. Cho đến thời điểm hiện tại, bài viết này đã đạt được 2,871 lượt xem.

Từ khoá virtual có một số đặc tính khá thú vị mà mình muốn chia sẻ với các đồng chí ngày hôm nay. Bài viết có vẻ hơi dài hơn mức cần thiết nhưng đừng ngại, tại mình copy paste code hơi nhiều thôi.

Tác dụng của từ khoá virtual, tại sao cần có virtual function.

Một số tài liệu có viết công dụng của Virtual Function như sau:

Virtual Function là để khai báo một function ở class cha (base class) mà sau đó các class kế thừa (derived class) có thể override function đó

Nhưng chờ đã, có gì không ổn ở chỗ này, nếu chỉ là để override thôi thì mình hoàn toàn có thể khai báo function ở base class mà không cần virtual thì vẫn được cơ mà. Vậy ko lẽ đồng chí Virtual Function này vô dụng? Để làm rõ vấn đề cũng như hạn chế buồn ngủ vì phải đọc quá nhiều chữ, chúng ta thử xét ví dụ nhỏ sau:

class Buffalo { public: void action(){printf("I'm eating grassn");}; }; class YoungBuffalo : public Buffalo { void action(){printf("I'm typing keyboardn");}; }; int main() { Buffalo *elon = new Buffalo(); YoungBuffalo *andy = new YoungBuffalo(); elon->action(); andy->action(); } 

Output sẽ ra như thế này:

I'm eating grass I'm typing keyboard 

Nếu chỉ xét đến đây thì cậu virtual chắc sẽ hơi buồn vì mọi chuyện có vẻ vẫn ổn mà không cần đến sự có mặt của nó. Vì vậy chúng ta thử xét tiếp 1 ví dụ khác để làm chỗ cho virtual toả sáng một chút.

class Buffalo { public: void action(){printf("I'm eating grassn");}; }; class YoungBuffalo : public Buffalo { public: void action(){printf("I'm typing keyboardn");}; }; int main() { Buffalo *elon = new Buffalo(); Buffalo *andy = new YoungBuffalo(); // khác với lúc nãy là YoungBuffalo *andy = new YoungBuffalo(); elon->action(); andy->action(); } 

Lần này output sẽ là như thế này:

I'm eating grass I'm eating grass 

Đến đây thì chắc không cần phải quá tinh mắt bạn cũng đã nhận ra vấn đề rồi đúng không. Mặc dù andy được tạo ra từ constructor của class YoungBuffalo thế nhưng nó hành xử lại như thể nó là một Buffalo. Thế nhưng ví dụ này trông hơi bị thiếu thông minh vì chả mấy ai khai báo Buffalo *andy = new YoungBuffalo(); như này để tự làm khó mình cả. Mình sẽ xét một ví dụ thực tế hơn chút nữa.

class Buffalo { public: void action(){printf("I'm eating grassn");}; }; class YoungBuffalo : public Buffalo { public: void action(){printf("I'm typing keyboardn");}; }; void takeAnBuffalo(Buffalo* buffalo){ buffalo->action(); } int main() { Buffalo *elon = new Buffalo(); Buffalo *andy = new YoungBuffalo(); takeAnBuffalo(elon); takeAnBuffalo(andy); } 

Output sẽ vẫn lại là:

I'm eating grass I'm eating grass 

Lúc này thì vấn đề thực sự đã rõ rồi, vì vậy chúng ta sẽ fix với vấn đề này với virtual như sau:

class Buffalo { public: virtual void action(){printf("I'm eating grassn");}; // thêm virtual vào chỗ này }; class YoungBuffalo : public Buffalo { public: void action(){printf("I'm typing keyboardn");}; }; void takeAnBuffalo(Buffalo* buffalo){ buffalo->action(); } int main() { Buffalo *elon = new Buffalo(); Buffalo *andy = new YoungBuffalo(); takeAnBuffalo(elon); takeAnBuffalo(andy); } 

Output:

I'm eating grass I'm typing keyboard 

Hoàn hảo! Lần này thì ai đã làm việc của người đó, Buffalo đã ăn cỏ, và YoungBuffalo đã gõ bàn phím. Ta sẽ đi đến mục tiếp theo.

Virtual Destructor

Virtual destructor cũng giống như các hàm virtual bình thường và được khai báo bằng cách thêm từ khoá virtual đằng trước hàm destructor. Nhưng trước khi học cách sử dụng virtual destructor, chúng ta sẽ nhìn qua một ví dụ mà không có virtual destructor.

class Animal { public: ~Animal(){printf("This is Animal's destructorn");}; }; class Cat : public Animal { public: ~Cat(){printf("This is Cat's destructorn");}; }; int main() { Animal* tom = new Cat(); delete tom; } 

Output:

This is Animal's destructor 

Chúng ta có thể thấy ngay là destructor của class Cat đã không được gọi, mặc dù tom được khởi tạo bằng constructor của class Cat. Điều này thật sự rất nguy hiểm, vì destructor của class Cat không được gọi nên các đối tượng riêng của lớp đó cũng không được giải phóng và vì thế object tom chỉ được giải phóng 1 phần tài nguyên, điều này gây ra rò rỉ bộ nhớ (hiện tượng bộ nhớ đã được cấp phát không thu hồi lại được). Để khắc phục chúng ta thêm từ khoá virtual vào trước destructor của base class.

class Animal { public: virtual ~Animal(){printf("This is Animal's destructorn");}; }; class Cat : public Animal { public: ~Cat(){printf("This is Cat's destructorn");}; }; int main() { Animal* tom = new Cat(); delete tom; } 

Output:

This is Cat's destructor This is Animal's destructor 

Virtual destructor là một thứ rất quan trọng khi bạn làm việc với C++, nếu bạn có ý định cho phép kế thừa class mà bạn đang viết thì bạn bắt buộc phải thêm virtual destructor cho class đó, ngược lại thì bạn đang ngầm ám chỉ rằng class của bạn không cho phép kế thừa. Điều này tương đương với từ khoá final trong Java. Nếu bạn thấy một class không có virtual destructor, đơn giản là đừng có kế thừa nó, vì nó đi không đúng với ý định của người viết ra class, và có thể gây ra thiệt hại hệ thống nếu bạn cố tình bỏ qua.

Tham khảo

Why do we need Virtual Methods in C++?

When to use virtual destructors?

Liên quan

Ethernet Switch Có Chức Năng Gì? - Xem 22,473

Ethernet Switch có chức năng gì? Switch là một thiết bị chọn lựa đường dẫn để gửi frame đến đích, hoạt động ở Lớp 2 của mô hình OSI. Đôi khi Switch còn được gọi là Bridge đa port hay Hub chuyển mạch. Switch quyết định chuyển frame dựa trên ... Khi các máy ở các cổng khác nhau cần liên lạc với nhau, Switch sẽ chuyển frame từ cổng này sang cổng kia và đảm bảo cung cấp chọn băng thông cho mỗi phiên kết nối. Để chuyển frame hiệu quả giữa các cổng, Switch lưu giữ một bảng địa chỉ. Khi Switch nhận vào một frame, nó sẽ ghi địa chỉ MAC của máy gửi tương ứng với cổng mà nó nhận frame đó vào. Sau đây là các đặc điểm chính


Oxit Axit Là Gì? Tính Chất Hóa Học Và Hướng Dẫn Bài Tập Oxit Axit - Xem 19,305

Oxit axit là các oxit khi tác dụng với nước sẽ tạo ra axit, tác dụng với kiềm tạo thành muối hóa học. Oxit axit thường là oxit của phi kim ứng với một axit hoặc kim loại có hóa trị cao. Vậy tính chất hóa học của oxit axit ... Oxit axit thường là oxit của phi kim ứng với một axit hoặc kim loại có hóa trị cao. Vậy tính chất hóa học của oxit axit là gì? Cách giải bài tập oxit axit tác dụng với bazo như thế nào? Cách gọi tên oxit axit Tên oxit axit: (Tên tiền tố chỉ số nguyên tử của phi kim) + Tên phi kim + (tên tiền tố chỉ số nguyên tử oxi) + ''Oxit'' Tính chất hóa học của oxit axit Trừ SiO 2 thì hầu hết các oxit axit


Drama Là Gì ? Ý Nghĩa Của Từ Drama Trên Facebook Là Gì? - Xem 16,236

Xã hội ngày càng phát triển kéo theo nhiều trào lưu xuất hiện, các thuật ngữ, ngôn từ mới lạ ngày càng nhiều trên các mạng. Những nội dung, các câu chuyện có tính chất kịch tính, gay cấn kéo dài luôn dành được sự quan tâm của các bạn ... Để lại hậu quả đó là nữ sinh không chịu nổi dư luận mà chọn kết thúc cuộc sống bằng cách tự tử. Đó là một câu chuyện minh chứng cho dư luận là con dao giết người vô hình. Thủ phạm là những người hít drama phát tán và buôn lời phán xét tiêu cực. Trên đấy là một vài thông tin để ta hiểu thêm drama là gì ? Cũng như giúp ta biết những việc nên và không nên làm về hít drama


Giải Vbt Vật Lý Lớp 6 - Xem 13,860

Giải bài tập môn Vật lý 6 Giải VBT Vật lý lớp 6 – Bài 8: Trọng lực – Đơn vị lực là tài liệu tham khảo môn Vật lý 6 hay dành cho các em học sinh, giúp các em ôn tập và củng cố kiến thức đã học ... Quả nặng vẫn đứng yên vì lực kéo của lò xo tác dụng vào đã cân bằng với trọng lượng của vật. Câu C2 trang 31 VBT Vật Lí 6: Lời giải: Điều chứng tỏ có một lực tác dụng lên viên phấn làm viên phấn là lực hút của Trái


Kimochi Yamate Là Gì? Ý Nghĩa Của I Cư Kimochi Yamete Trong Tiếng Nhật? - Xem 12,177

Kimochi Yamate hay i cư kimochi và i kư kimochi là những thuật ngữ, cụm từ được sử dụng khả phổ biến trong thời đại hiện nay. Nhưng bạn có thật sự hiểu được nghĩa của từ kimochi là gì? Ở bài viết dưới đây, Doisonggiaitri.com sẽ giải đáp toàn ... Và được sử dụng nhiều với hàm nghĩ khi mà nam giới thoả mãn bạn giới của mình và ngược lại. Cho nên khi sử dụng kimochi trong ngữ cảnh này khá nhạy cảm nên các bạn trẻ nên lưu ý khi sử dụng để tránh gây khiếm nhã nhé. Tại sao các bạn trẻ lại thường xuyên sử dụng kimochi với hàm nghĩa trên? Đây là điều hoàn toàn dễ hiểu bởi chúng ta thường biết rằng, Nhật Bản là nơi có


Đa Dạng Sinh Học Là Gì? Nguyên Nhân, Biện Pháp Hạn Chế Suy Giảm Đa Dạng Sinh Học - Xem 11,682

Đa dạng sinh học là sự phong phú của nhiều nhiều dạng, loài và các biến dị di truyền của mọi sinh vật trong đời sống tự nhiên, sự đa dạng và phong phú này được chia làm nhiều cấp độ tổ chức sinh giới đặc biệt là với các ... Hầu hết các chuyên gia đều cho rằng với nguyên nhân từ con người là do sự phá hủy đất để canh tác nông nghiệp cũng như gây xáo trộn trong việc nhập nội các loài đã tính đa dạng đồng thời còn săn bắn và giết thịt, việc loài người định cư cũng là một trong những nguyên nhân chính cho sự tuyệt chủng của những loài động vật và chim đã tồn tại từ nhiều năm trước đây! Tốc độ


Z Là Gì Trong Toán Học? - Xem 11,187

Bạn có từng nghe về tập hợp R trong toán học chưa? Hẳn là rất rất quen phải không? Dĩ nhiên rồi vì lớp 6 lớp 7 chúng ta được học cái này mà. Vậy Z là gì trong toán học nhỉ? “Tập hợp Z là tập hợp các số ... Vậy Z là gì trong toán học nhỉ? "Tập hợp Z là tập hợp các số nguyên âm, số nguyên dương và số 0. Z= {...; -2; -1; 0; 1; 2; ...}" VD: -10; -9; -8; 100 ; 0 đều thuộc tập hợp Z Tập hợp z trong toán học còn có một tên gọi khác là số nguyên. Tập hợp số nguyên chỉ ra các số nguyên là miền xác định nguyên duy nhất mà các phần tử dương của nó được sắp thứ tự tốt và các thứ tự đó


Tb Là Gì Trên Facebook? - Xem 10,989

TB nghĩa là gì? TB là viết tắt của từ gì? TB là 1 từ viết tắt có rất nhiều nghĩa tiếng việt và tùy từng ngữ cảnh mà ta hiểu nó sẽ có nghĩa là gì, dưới đây là các nghĩa hay được sử dụng nhất của từ viết ... Đơn vị này cao cấp hơn Gigabyte - GB. 1 TB = 1024 GB 5 TB = 5120 GB 10 TB = 10240 GB Ví dụ: Bạn có ổ cứng dung lượng 2 TB tức là ổ cứng của bạn bằng 2048 GB Một bộ phim, thư mục, video có dung lượng 1TB tức là 1048 GB -phim HD dung lượng cao. Vậy nếu bạn thấy đứng đằng trước TB là 1 con số thì nó thường là viết tắt của cụm từ Terabyte TB trên Facebook nghĩa là gì? Đối với


Số Cvv/cvc Trên Thẻ Atm Vietcombank Là Gì? - Xem 10,098

Số Cvv/Cvc trên thẻ atm đang được rất nhiều chủ thẻ quan tâm. Nhất là với những người dùng thẻ atm Vietcombank. Vậy số Cvv/Cvc trên thẻ atm vietcombank là gì? Bị lộ có sao không? Số Cvv/Cvc trên thẻ atm vietcombank là gì? Không phải ai dùng thẻ atm ... Thì việc bảo mật thẻ của mình là điều vô cùng quan trọng. Tốt hơn hết là không nên đưa thẻ tín dụng của mình cho người khác dù chỉ trong thời gian ngắn. Nhất là không chụp ảnh thẻ tín dụng của mình để gửi cho ai


Mã Zip Iphone Là Gì? - Xem 9,900

Zip Code (mã zip) là một trong những khái niệm không quá xa lạ đối với thế hệ trẻ. Chúng liên quan trực tiếp tới quy trình giao – Nhận bưu kiện khi mua sắm online hay đặt hàng thông qua các ứng dụng giao dịch trực tuyến. Không chỉ ... Những mã này thường xuất hiện trên các website có hỗ trợ dịch vụ đặt mua - Thanh toán thiết bị do Apple phân phối. Đồng thời, chúng cũng khá phổ biến trong phần giới thiệu các dòng thiết bị. Sự khác biệt cơ bản giữa mã zip iphone với các loại mã khác đó là về tính năng. Loại mã zip này cho phép Apple kiểm tra vị trí, thông tin cơ bản và phương thức thanh toán của người tiêu dùng trong


Đề xuất

Rượu Là Gì? Những Điều Có Thể Bạn Chưa Biết Về Rượu? - Xem 3,168

Rượu là một thức uống quen thuộc, được ưa chuộng trên toàn thế giới. Bạn có hiểu nhiều điều về rượu? Cùng khám phá rượu là gì và những điều có thể bạn chưa biết về rượu nhé. Rượu trong hóa học là một hợp chất hữu cơ chứa nhóm ... Ủ ướt trong vòng từ 1-2 tuần( tùy theo mùa và thời tiết). Khi nếm cơm và nước thấy vị cay, nước trong là có thể đem đi chưng cất. Bước 5: Chưng cất Rượu. Đổ tất cả nước và cái Rượu vào nồi( nếu muốn năng suất và


Phishing Là Gì? Và Cách Để Bạn Bảo Vệ Mình - Xem 2,871

Phishing là hình thức tấn công mạng bằng việc xây dựng những hệ thống lừa đảo nhằm đánh cắp các thông tin nhạy cảm, như tên đăng nhập, mật khẩu hay thông tin về các loại thẻ tín dụng của người dùng. Phishing xuất hiện như một thực thể đáng ... Chúng thường bao gồm các biểu tượng chính thức từ các tổ thức thực sự và các thông tin nhận dạng khác được lấy từ trang web hợp pháp. Dưới đây là một ví dụ về cách thực hiện một email phishing: Một email lừa đảo bao gồm một URL


Kinh Tế Học Vĩ Mô - Xem 3,564

Kinh tế học vĩ mô hay là kinh tế tầm lớn (Macroeconomic) là một phân ngành của kinh tế học chuyên nghiên cứu về đặc điểm, cấu trúc và hành vi của cả một nền kinh tế nói chung. Kinh tế học vĩ mô và kinh tế học vi mô ... Trường phái Keynes còn khẳng định những biến động của tổng cầu có tác động rất lớn trong ngắn hạn tới sản lượng thực tế và tới việc làm, nhưng không tác động tới vật giá - hay vật giá cứng nhắc. Chính vì vật giá cứng


Mã Otp Là Gì? Làm Gì Để Có Mã Otp? - Xem 2,970

Khi thực hiện các giao dịch online phải thanh toán trực tuyến hoặc thực hiện các giao dịch với tài khoản thẻ ATM nội địa,… bạn thường được yêu cầu nhập mã OTP. Chỉ mình bạn được xem mã OTP của mình và mã OTP sẽ mất hiệu lực trong ... Thậm chí khi bạn chưa sử dụng thì sau khoảng 30 giây đến 2 phút, mã xác nhận này cũng không còn hiệu lực. Và bạn cũng không thể sử dụng nó cho bất kì giao dịch nào khác. OTP thường được dùng để làm bảo mật 2 lớp trong các giao dịch xác minh đăng nhập, đặc biệt là giao dịch với tài khoản ngân hàng. OTP giúp ngăn chặn, giảm thiểu những rủi ro bị tấn công khi


Môi Trường Pháp Luật Và Các Dòng Luật - Xem 2,772

Kết quả Môi trường pháp luật và các dòng luật: -Là một yếu tố thuộc môi trường bên ngoài tác động vào quá trình hoạt động của doanh nghiệp. -Pháp luật là hệ thống các quy tắc xử sự chung (quy phạm pháp luật) do nhà nước ban hành hoặc ... -Hệ thống luật lục địa phát triển khá hoàn hảo phần dân luật, đặc biệt là nhánh luật thương mại và luật hợp đồng. Một số điểm nội bật: -Nhấn mạnh sự đảm bảo về quyền sở hữu, sự tự do kết ước và giá trị


Bạn đang xem bài viết Từ Khoá Virtual Trong C++ trên website Doisonggiaitri.com. Hy vọng những thông tin mà chúng tôi đã chia sẻ là hữu ích với bạn. Nếu nội dung hay, ý nghĩa bạn hãy chia sẻ với bạn bè của mình và luôn theo dõi, ủng hộ chúng tôi để cập nhật những thông tin mới nhất. Chúc bạn một ngày tốt lành!