Ở bài này, bọn họ sẽ mày 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 lại đến nhỏ trỏ đối tượng. Các chúng ta cũng có thể đọc lại bài xích Khai báo và thực hiện con trỏ đối tượng người sử dụng trong C++ để xem lại kỹ năng và kiến thức đó.
Bạn đang xem:
1. Hàm ảo (virtual function) là gì?
Hàm ảo (virtual function) là một hàm thành viên trong lớp cửa hàng mà lớp dẫn xuất khi kế thừa cần phải có mang lại.Hàm ảo được sử dụng trong lớp các đại lý khi cần bảo đảm an toàn hàm ảo đó sẽ tiến hành định nghĩa lại vào 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 con trỏ bao gồm 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.Để đọc tại sao phải thực hiện hàm ảo, bọn họ cùng để mắt tới một ví dụ:class Base{public:void print(){coutLớp Derived thừa kế public từ lớp Base. Bọn họ tạo một con trỏ (pointer) gồm kiểu là lớp Base trỏ cho một đối tượng của lớp Derived. Sau đó, gọi hàm print() thì thực chất là call hàm print() của lớp Base. Mà chúng ta muốn là đề nghị gọi đến hàm print() của lớp Derived bởi bé trỏ vẫn trỏ đến đối tượng người tiêu 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 sự cố này, chúng ta khai báo hàm print() trong lớp Base là 1 trong 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 điện thoại tư vấn hàm print() thông qua con trỏ thì sẽ điện thoại tư vấn đến hàm được định nghĩa lại trong lớp dẫn xuất.Hàm ảo là một trong những phần không thể thiếu hụt để bộc lộ tính đa hình trong kế thừa được cung ứng bởi nguồn ngữ C++.Xem thêm: Cách Đăng Nhập Outlook 2013 ), Hướng Dẫn Cài Đặt Mail Trên Outlook 2013
Lưu ý: con trỏ của lớp cơ sở rất có thể chứa địa chỉ của đối tượng người sử dụng thuộc lớp dẫn xuất, nhưng trái lại thì không được.
2. Định nghĩa hàm ảo (virtual function)
Sử dụng từ khóa virtual để có mang một hàm ảo trong lớp cơ sở. Lớp dẫn xuất thừa kế từ lớp cửa hàng 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ì khi được call từ một con trỏ. Sử dụng hàm ảo khi ý muốn con trỏ vẫn trỏ tới đối tượng người sử dụng của lớp nào thì hàm thành phần của lớp đó sẽ được gọi nhưng mà không coi xét cho kiểu của con trỏ.
Xem thêm: Sửa Lỗi Không Vào Được Một Số Trang Web Bằng Google Chrome, Không Có Trang Web Này
3. Ví dụ thực hiện hàm ảo
#include #include using namespace std;class Animalprivate:string type;public: // constructor to 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 cát : public Animalprivate:string type;public: // constructor to 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 đại lý của lớp Dog và Cat. Tạo các con trỏ animal1, dog1, cat1 tất cả kiểu là Animal trỏ để các đối tượng của lớp Animal, Dog, Cat. Một hàm ảo getType() được khai báo vào lớp đại lý Animal. Những lớp dẫn xuất Dog và Cat khái niệm lại hàm này.Khi hàm print(animal1) được gọi, bé trỏ trỏ cho một đối tượng người tiêu dù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, nhỏ trỏ trỏ cho một đối tượng của lớp Dog. Hàm ảo getType() được khái niệm là trong lớp Dog được gọi.Khi hàm print(cat1) được gọi, nhỏ trỏ trỏ mang lại một đối tượ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 xích sau vào 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++ >>