8. Đa hình trong lập trình C++ hướng đối tượng

Trong lập trình C++ hướng đối tượng, Đa hình (Polymorphism) là một khái niệm quan trọng trong lập trình hướng đối tượng, cho phép một đối tượng có thể thực hiện các hành vi khác nhau tùy thuộc vào ngữ cảnh. Đa hình giúp bạn viết mã linh hoạt hơn và tạo ra các hệ thống mở rộng có khả năng mở rộng tương lai.

Có hai loại đa hình trong C++:

  1. Đa hình biên dịch (Compile-time Polymorphism): Còn được gọi là đa hình tĩnh, thường được thực hiện thông qua việc sử dụng nạp chồng hàm (function overloading) và nạp chồng toán tử (operator overloading). Trong đa hình biên dịch, quyết định về việc chọn hàm nạp chồng dựa trên số lượng và kiểu đối số được xác định tại thời gian biên dịch.
  2. Đa hình chạy thời gian (Runtime Polymorphism): Còn được gọi là đa hình động, thường được thực hiện thông qua việc sử dụng kế thừa và ghi đè phương thức (method overriding). Trong đa hình chạy thời gian, quyết định về việc chọn phương thức được xác định tại thời gian chạy dựa trên kiểu thực tế của đối tượng.

Dưới đây là một ví dụ về đa hình trong C++ sử dụng kế thừa và ghi đè phương thức:

cpp
#include <iostream>

class Shape {
public:
    virtual void displayArea() {
        std::cout << "Diện tích của hình không được xác định." << std::endl;
    }
};

class Circle : public Shape {
private:
    double radius;

public:
    Circle(double r) : radius(r) {}

    void displayArea() override {
        double area = 3.14159 * radius * radius;
        std::cout << "Diện tích hình tròn: " << area << std::endl;
    }
};

class Rectangle : public Shape {
private:
    double width;
    double height;

public:
    Rectangle(double w, double h) : width(w), height(h) {}

    void displayArea() override {
        double area = width * height;
        std::cout << "Diện tích hình chữ nhật: " << area << std::endl;
    }
};

int main() {
    Shape* shapes[2];
    Circle circle(5.0);
    Rectangle rectangle(4.0, 6.0);

    shapes[0] = &circle;
    shapes[1] = &rectangle;

    for (int i = 0; i < 2; ++i) {
        shapes[i]->displayArea();
    }

    return 0;
}

Trong ví dụ trên, chúng ta có một lớp cơ sở Shape với một phương thức ảo (virtual) displayArea, lớp CircleRectangle là các lớp dẫn xuất từ Shape và ghi đè phương thức displayArea để tính diện tích của hình tròn và hình chữ nhật. Trong hàm main, chúng ta tạo một mảng con trỏ shapes trỏ tới các đối tượng CircleRectangle, và gọi phương thức displayArea của từng đối tượng. Điều này cho phép chúng ta thấy sự đa hình chạy thời gian trong tác động.

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top