Chuyển đến nội dung chính
Mô-đun 6 · Bài học 2 trong tổng số 214/18 trong khóa học~15 min
Bài học theo mô-đun (2/2)

Đa hình và hàm ảo

Đa hình cho phép chúng ta xử lý các đối tượng của các lớp dẫn xuất khác nhau thông qua một con trỏ hoặc tham chiếu đến lớp cơ sở của chúng, đảm bảo phiên bản chính xác của một phương thức được gọi trong thời gian chạy (Liên kết muộn).

Hàm ảo: virtual và override

Để kích hoạt tính đa hình trên một phương thức, chúng ta phải khai báo nó bằng từ khóa virtual bên trong lớp cơ sở. Trong các lớp dẫn xuất, chúng tôi sử dụng công cụ xác định override để tuyên bố rõ ràng rằng chúng tôi đang ghi đè phương thức đó.

C++
class Employee {
public:
    virtual void work() {
        std::cout << "Generic work" << std::endl;
    }
    // IMPORTANT: Virtual destructor in base class to avoid memory leaks
    virtual ~Employee() = default;
};

class Developer : public Employee {
public:
    void work() override {
        std::cout << "Writing C++ code" << std::endl;
    }
};

Sử dụng con trỏ tới lớp cơ sở, C++ sẽ giải quyết phương thức đúng khi chạy:

C++
Employee* emp = new Developer();
emp->work(); // Prints "Writing C++ code" instead of "Generic work"
delete emp;

Các lớp trừu tượng và các hàm ảo thuần túy

Hàm ảo thuần túy là hàm thành viên ảo được khai báo bằng = 0 ở cuối. Nó đại diện cho một hợp đồng chính thức: lớp cơ sở không cung cấp việc triển khai nào, ủy quyền hoàn toàn cho các lớp con.

Một lớp chứa ít nhất một hàm ảo thuần túy được gọi là Lớp trừu tượng và không thể được khởi tạo trực tiếp.

C++
class Instrument {
public:
    virtual void play() = 0; // Pure virtual
    virtual ~Instrument() = default;
};

class Piano : public Instrument {
public:
    void play() override {
        std::cout << "Playing piano..." << std::endl;
    }
};

Hãy tự mình thử

tập thể dục#cpp.m6.l2.e1
Nỗ lực: 0Đang tải…

Xác định phương thức ảo makeSound() trong Animal in ra 'Some sound'. Sau đó ghi đè nó trong lớp Cat bằng cách sử dụng công cụ xác định ghi đè để in 'Meow'.

Đang tải trình chỉnh sửa…
Hiển thị gợi ý

Hãy nhớ thêm `ảo` vào phương thức lớp cơ sở và đặt `ghi đè` sau dấu ngoặc đơn tham số trong lớp dẫn xuất.

Giải pháp khả dụng sau 3 lần thử

tập thể dục#cpp.m6.l2.e2
Nỗ lực: 0Đang tải…

Khai báo một hàm ảo thuần túy print() trả về void trong lớp trừu tượng Printable. Sau đó, tạo lớp Tài liệu kế thừa công khai từ Có thể in và triển khai phương thức print() để in 'Tài liệu in'.

Đang tải trình chỉnh sửa…
Hiển thị gợi ý

Một hàm ảo thuần túy được khai báo bằng chữ ký `virtual void print() = 0;`. Đảm bảo `Tài liệu` kế thừa công khai từ `Có thể in`.

Giải pháp khả dụng sau 3 lần thử