C++ Polymorphism

Khái Niệm Về Polymorphism Trong C++

Polymorphism (đa hình) là một trong những khái niệm quan trọng trong lập trình hướng đối tượng. Trong C++, đa hình cho phép các hàm và phương thức hành xử khác nhau dựa trên đối tượng gọi chúng. Điều này mang lại sự linh hoạt và tái sử dụng mã nguồn, giúp lập trình viên dễ dàng mở rộng và bảo trì ứng dụng.

Các Loại Polymorphism

Trong C++, đa hình có thể được chia thành hai loại chính:

1. Compile-time Polymorphism (Đa hình thời gian biên dịch)

Đây là loại đa hình xảy ra khi hàm hoặc toán tử được xác định tại thời điểm biên dịch. Các phương thức chính của nó bao gồm:

  • Function Overloading: Là khả năng định nghĩa nhiều hàm với cùng tên nhưng khác tham số.
  • Operator Overloading: Là khả năng định nghĩa hành vi của các toán tử cho các kiểu dữ liệu tự định nghĩa.

2. Run-time Polymorphism (Đa hình thời gian chạy)

Đây là loại đa hình xảy ra trong thời gian chạy, dựa trên các đối tượng của lớp dẫn xuất. Nó thường được đạt được thông qua:

  • Virtual Functions: Các hàm ảo cho phép lớp dẫn xuất cung cấp định nghĩa cụ thể cho các phương thức mà lớp cơ sở đã định nghĩa.

Cú Pháp Của Polymorphism Trong C++

1. Function Overloading

Cú pháp để thực hiện function overloading như sau:

void func(int a);
void func(double b);
void func(int a, double b);

Ví Dụ Về Function Overloading

#include <iostream>
using namespace std;

void print(int a) {
    cout << "Integer: " << a << endl;
}

void print(double b) {
    cout << "Double: " << b << endl;
}

void print(int a, double b) {
    cout << "Integer: " << a <<, " Double: " << b << endl;
}

int main() {
    print(5);
    print(5.5);
    print(3, 4.5);
    return 0;
}

2. Operator Overloading

Cú pháp để thực hiện operator overloading:

class Complex {
public:
    // Overloading + operator
    Complex operator+(const Complex& other);
};

Ví Dụ Về Operator Overloading

#include <iostream>
using namespace std;

class Complex {
public:
    int real;
    int imag;

    Complex(int r = 0, int i = 0) : real(r), imag(i) {}

    Complex operator+(const Complex& other) {
        return Complex(real + other.real, imag + other.imag);
    }

    void display() {
        cout << real << " + " << imag << "i" << endl;
    }
};

int main() {
    Complex c1(2, 3), c2(4, 5);
    Complex c3 = c1 + c2;
    c3.display();
    return 0;
}

3. Virtual Functions

Cú pháp để khai báo một hàm ảo trong C++:

class Base {
public:
    virtual void show() {
        cout << "Base class" << endl;
    }
};

Ví Dụ Về Virtual Functions

#include <iostream>
using namespace std;

class Base {
public:
    virtual void show() {
        cout << "Base class" << endl;
    }
};

class Derived : public Base {
public:
    void show() override {
        cout << "Derived class" << endl;
    }
};

int main() {
    Base* b;
    Derived d;
    b = &d;

    b->show(); // Gọi hàm show của lớp Derived
    return 0;
}

Kết Luận

Polymorphism là một khía cạnh quan trọng giúp nâng cao khả năng mở rộng và tái sử dụng trong lập trình hướng đối tượng. C++ cung cấp nhiều cách để đạt được đa hình, bao gồm function overloading, operator overloading và virtual functions. Việc hiểu và sử dụng thành thạo các kỹ thuật này giúp lập trình viên phát triển các ứng dụng phong phú và linh hoạt hơn.