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

Bạn đang xem:

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

Hàm ảo (virtual function) là một trong 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ơ sở khi cần đảm bảo hàm ảo đó sẽ tiến hành định nghĩa lại trong lớp dẫn xuất. Bài toán này rất cần thiết trong ngôi trường hợp bé trỏ tất cả kiểu là lớp các đại lý trỏ đến đối tượng người dùng của lớp dẫn xuất.Để phát âm tại sao phải sử dụng hàm ảo, họ cùng chăm chú một ví dụ:class Base{public:void print(){coutLớp Derived kế thừa public tự lớp Base. Chúng ta tạo một con trỏ (pointer) gồm kiểu là lớp Base trỏ mang đến một đối tượng của lớp Derived. Sau đó, điện thoại tư vấn hàm print() thì bản chất là điện thoại tư vấn hàm print() của lớp Base. Mà họ muốn là đề nghị gọi đến hàm print() của lớp Derived bởi bé trỏ đang trỏ đến đối tượng người 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 vấn đề này, chúng ta khai báo hàm print() vào lớp Base là 1 trong những hàm ảo. Cơ hội này, lớp dẫn xuất nên định nghĩa lại hàm ảo đó. Khi điện thoại tư vấn hàm print() trải qua con trỏ thì sẽ điện thoại tư vấn đến hàm được quan niệm 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 để diễn đạt tính nhiều hình trong kế thừa được hỗ trợ bởi nguồn ngữ C++.

Xem thêm: Từ Vựng Về Bộ Môn Cầu Lông Tiếng Anh Là Gì, Vietgle Tra Từ

Lưu ý: nhỏ trỏ của lớp cơ sở hoàn toàn có thể chứa showroom của đối tượng người dù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 để quan niệm một hàm ảo vào lớp cơ sở. Lớp dẫn xuất thừa kế từ lớp cơ sở phải khái niệm 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ông giống hàm thành phần thông thường khi được điện thoại tư vấn từ một con trỏ. áp dụng hàm ảo khi ý muốn con trỏ sẽ trỏ tới đối tượng người tiêu dùng của lớp như thế nào thì hàm thành phần của lớp đó sẽ tiến hành gọi mà không xem xét đến kiểu của nhỏ trỏ.

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

#include #include using namespace std;class Animalprivate:string type;public: // constructor khổng lồ initialize type Animal()type = "Animal"; // declare virtual function virtual string getType() return type; ;class Dog : public Animalprivate:string type;public: // constructor to lớn initialize type Dog()type = "Dog"; string getType() return type; ;class cát : public Animalprivate:string type;public: // constructor khổng lồ 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ửa hàng của lớp Dog cùng Cat. Tạo các con trỏ animal1, dog1, cat1 có kiểu là Animal trỏ nhằm các đối tượng người dùng của lớp Animal, Dog, Cat. Một hàm ảo getType() được khai báo trong lớp cửa hàng Animal. Các lớp dẫn xuất Dog cùng Cat định nghĩa 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 vẫn thực thi.Khi hàm print(dog1) được gọi, bé trỏ trỏ cho một đối tượng người tiêu 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ỏ mang đến một đối tượng người sử dụng của lớp Cat. Hàm ảo getType() được định nghĩa là trong lớp Cat được gọi.
Bài trước và bài bác sau trong môn học>" data-wpel-link="internal">Hàm thuần ảo (pure virtual function) và lớp trừu tượng (abstract class) trong C++ >>