Ở bài bác này, họ sẽ tò mò hàm ảo (virtual function) trong C++. Bài này có các kiến thức và kỹ năng liên quan tiền đến con trỏ đối tượng. Các chúng ta có thể đọc lại bài xích Khai báo và áp dụng con trỏ đối tượng người sử dụng trong C++ để thấy lại kỹ năng đó.

Bạn đang xem: Virtual function (hàm ảo), override và final

1. Hàm ảo (virtual function) là gì?

Hàm ảo (virtual function) là 1 trong những hàm member trong lớp đại lý mà lớp dẫn xuất khi thừa kế cần phải khái niệm lại.Hàm ảo được áp dụng trong lớp các đại lý khi cần bảo đảm hàm ảo đó sẽ được định nghĩa lại vào lớp dẫn xuất. Việc này rất quan trọng trong trường hợp nhỏ trỏ có kiểu là lớp cơ sở trỏ đến đối tượng của lớp dẫn xuất.Để gọi tại sao phải thực hiện hàm ảo, họ cùng chú ý một ví dụ:class Base{public:void print(){coutLớp Derived kế thừa public trường đoản cú lớp Base. Họ tạo một con trỏ (pointer) bao gồm kiểu là lớp Base trỏ cho một đối tượng người tiêu dùng của lớp Derived. Sau đó, gọi hàm print() thì thực chất là gọi hàm print() của lớp Base. Mà họ muốn là đề xuất gọi mang đến hàm print() của lớp Derived bởi nhỏ trỏ vẫn trỏ đến đối tượng người sử dụng của lớp Derived.void main()Derived derived1;Base* base1 = &derived1;//calls function of Base classbase1->print();system("pause");Kết quảBase classĐể tránh trường hợp này, bọn họ khai báo hàm print() trong lớp Base là một hàm ảo. Cơ hội này, lớp dẫn xuất đề xuất định nghĩa lại hàm ảo đó. Khi hotline hàm print() thông qua con trỏ thì sẽ gọi đến hàm được định nghĩa lại vào lớp dẫn xuất.Hàm ảo là một trong những phần không thể thiếu hụt để miêu tả tính đa hình trong thừa kế được cung cấp bởi nguồn ngữ C++.Lưu ý: bé trỏ của lớp cơ sở có thể chứa địa chỉ của đối tượng thuộc lớp dẫn xuất, nhưng trái lại thì ko được.

2. Định nghĩa hàm ảo (virtual function)

Sử dụng trường đoản cú khóa virtual để định nghĩa một hàm ảo trong lớp cơ sở. Lớp dẫn xuất thừa kế từ lớp cơ sở phải có mang lại hàm ảo.#include using namespace std;class Base{public:virtual void print()//virtual functioncoutprint();system("pause");Kết quảDerived class
*

Hàm ảo chỉ khác hàm thành phần thông thường khi được call từ một nhỏ trỏ. Thực hiện hàm ảo khi mong mỏi con trỏ đã trỏ tới đối tượng người tiêu dùng của lớp nào thì hàm nhân tố của lớp đó sẽ được gọi nhưng mà không coi xét mang đến kiểu của nhỏ trỏ.

Xem thêm: Hẹn Hò Trên Tinder App Là Gì ? Những Sự Thật Không Phải Ai Cũng Biết Về Tinder

3. Ví dụ sử dụng hàm ảo

#include #include using namespace std;class Animalprivate:string type;public: // constructor to lớn initialize type Animal()type = "Animal"; // declare virtual function virtual string getType() return type; ;class Dog : public Animalprivate:string type;public: // constructor to initialize type Dog()type = "Dog"; string getType() return type; ;class cat : public Animalprivate:string type;public: // constructor to lớn initialize type Cat()type = "Cat"; string getType() return type; ;void print(Animal* ani) { coutgetType()Kết quảAnimal: AnimalAnimal: DogAnimal: CatLớp Animal là lớp các đại lý của lớp Dog cùng Cat. Tạo những con trỏ animal1, dog1, cat1 gồm kiểu là Animal trỏ nhằm các đối tượng người sử dụng của lớp Animal, Dog, Cat. Một hàm ảo getType() được khai báo vào lớp cửa hàng Animal. Các lớp dẫn xuất Dog với Cat có mang lại hàm này.Khi hàm print(animal1) được gọi, nhỏ trỏ trỏ mang đến một đối tượng của lớp Animal. Hàm ảo getType() của lớp Animal sẽ thực thi.Khi hàm print(dog1) được gọi, bé trỏ trỏ đến một đối tượng người dùng của lớp Dog. Hàm ảo getType() được khái niệm là vào lớp Dog được gọi.Khi hàm print(cat1) được gọi, nhỏ trỏ trỏ đến một đối tượng người sử dụng của lớp Cat. Hàm ảo getType() được quan niệm là trong lớp Cat được gọi.
Bài trước và bài sau trong môn học>" data-wpel-link="internal">Hàm thuần ảo (pure virtual function) cùng lớp trừu tượng (abstract class) trong C++ >>