Hàm ảo là hàm thành phần của lớp, nó đợc khai báo trong lớp cơ sở và định nghĩa lại trong lớp dẫn xuất. Để định nghĩa hàm ảo thì phần khai báo hàm phải bắt đầu bằng từ khóa virtual. Khi một lớp có chứa hàm ảo đợc kế thừa, lớp dẫn xuất sẽ định nghĩa lại hàm ảo đó cho chính mình. Các hàm ảo triển khai t tởng chủ đạo của tính đa hình là “ một giao diện cho nhiều hàm thành phần”. Hàm ảo bên trong lớp cơ sở định nghĩa hình thức giao tiếp đối với hàm đó. Việc định nghĩa lại hàm ảo ở lớp dẫn xuất là thi hành các tác vụ của hàm liên quan đến chính lớp dẫn xuất đó. Nói cách khác, định nghĩa lại hàm ảo chính là tạo ra ph- ơng thức cụ thể. Trong phần định nghĩa lại hàm ảo ở lớp dẫn xuất, không cần phải sử dụng lại từ khóa virtual.
Khi xây dựng hàm ảo, cần tuân theo những quy tắc sau : 1. Hàm ảo phải là hàm thành phần của một lớp ;
2. Những thành phần tĩnh (static) không thể khai báo ảo; 3. Sử dụng con trỏ để truy nhập tới hàm ảo;
4. Hàm ảo đợc định nghĩa trong lớp cơ sở, ngay khi nó không đợc sử dụng; 5. Mẫu của các phiên bản (ở lớp cơ sở và lớp dẫn xuất) phải giống nhau. Nếu
hai hàm cùng tên nhng có mẫu khác nhau thì C++ sẽ xem nh hàm tải bội; 6. Không đợc tạo ra hàm tạo ảo, nhng có thể tạo ra hàm hủy ảo;
7. Con 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, nhng ngợc lại thì không đợc;
8. Nếu dùng con trỏ của lớp cơ sở để trỏ đến đối tợng của lớp dẫn xuất thì phép toán tăng giảm con trỏ sẽ không tác dụng đối với lớp dẫn xuất, nghĩa là không phải con trỏ sẽ trỏ tới đối tợng trớc hoặc tiếp theo trong lớp dẫn xuất. Phép toán tăng giảm chỉ liên quan đến lớp cơ sở.
Ví dụ:
class A { ...
virtual void hienthi() {
cout<<”\nDay la lop A”; }; }; class B : public A { ... void hienthi()
{ cout<<”\nDay la lop B”; } }; class C : public B { ... void hienthi() { cout<<”\nDay la lop C”; } }; class D : public A { ... void hienthi() { cout<<”\nDay la lop D”; } };
Chú ý: Từ khoá virtual không đợc đặt bên ngoài định nghĩa lớp. Xem ví dụ : class A
{ ...
virtual void hienthi(); };
virtual void hienthi() // sai {
cout<<”\nDay la lop A”; }