Trước khi tìm hiểu về hàm thuần ảo (pure virtual function), các bạn nên có kiến thức về kế thừa và hảm ảo. Các bạn có thể đọc lại các bài sau:
1. Hàm thuần ảo (pure virtual function) là gì?
Hàm thuần ảo (pure virtual function) được sử dụng khi:
- Không cần sử dụng hàm này trong lớp cơ sở, chỉ phục vụ cho lớp dẫn xuất
- Lớp dẫn xuất bắt buộc phải định nghĩa lại hàm thuần ảo
Ví dụ, chúng ta có một lớp cơ sở là Shape. Các lớp dẫn xuất của lớp Shape là Triangle, Square và Circle. Chúng ta muốn tính diện tích của các hình này.
Chúng ta có thể tạo ra một hàm thuần ảo có tên là calculateArea()
trong lớp Shape. Các lớp Triangle, Square và Circle phải định nghĩa lại hàm calculateArea()
với công thức tính diện tích khác nhau cho mỗi hình.
Hàm thuần ảo không có thân hàm và bắt buộc phải kết thúc với “= 0”.
class Shape{
public:
// creating a pure virtual function
virtual void calculateArea() = 0;
};
Lưu ý: Cú pháp “= 0” không phải là gán hàm thuần ảo có giá trị bằng 0. Nó chỉ là cú pháp cho biết đó là hàm thuần ảo (pure virtual function).
2. Lớp trừu tượng (abstract class)
Một lớp bao gồm hàm thuần ảo được gọi là lớp trừu tượng (abstract class). Trong ví dụ ở phần 1, Shape là một lớp trừu tượng.
Chúng ta không thể tạo ra các đối tượng của một lớp trừu tượng. Mục đích chính của lớp trừu tượng là để các lớp khác kế thừa lại.
#include <iostream>
using namespace std;
//Abstract class
class Shape{
protected:
float dimension;
public:
void getDimension(){
cin >> dimension;
}
// pure virtual Function
virtual float calculateArea() = 0;
};
// Derived class
class Square : public Shape{
public:
float calculateArea() {
return dimension * dimension;
}
};
// Derived class
class Circle : public Shape{
public:
float calculateArea() {
return 3.14 * dimension * dimension;
}
};
void main(){
Square square;
Circle circle;
cout << "Enter the length of the square: ";
square.getDimension();
cout << "Area of square: " << square.calculateArea() << endl;
cout << "\nEnter radius of the circle: ";
circle.getDimension();
cout << "Area of circle: " << circle.calculateArea() << endl;
system("pause");
}
Kết quả
Enter the length of the square: 5
Area of square: 25
Enter radius of the circle: 9
Area of circle: 254.34
Hàm thuần ảo calculateArea()
được khai báo trong lớp trừu tượng Shape. Các lớp dẫn xuất Square và Circle phải định nghĩa lại hàm calculateArea()
nếu không chương trình sẽ báo lỗi.