Hàm thuần ảo (pure virtual function) và lớp trừu tượng (abstract class) trong C++

Đây là bài 17/19 bài của series môn học Lập trình hướng đối tượng

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 ShapeTriangle, SquareCircle. 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, SquareCircle 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 “= 0khô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 SquareCircle phải định nghĩa lại hàm calculateArea() nếu không chương trình sẽ báo lỗi.

5/5 - (1 bình chọn)
Bài trước và bài sau trong môn học<< Hàm ảo (virtual function) trong lập trình hướng đối tượng với C++Khái niệm đa hình (polymorphism) trong lập trình hướng đối tượng >>
Chia sẻ trên mạng xã hội:

Trả lời

Lưu ý:

1) Vui lòng bình luận bằng tiếng Việt có dấu.

2) Khuyến khích sử dụng tên thật và địa chỉ email chính xác.

3) Mọi bình luận trái quy định sẽ bị xóa bỏ.