Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Lập Trình C

Các kiểu đa hình - Ad-hoc, Inclusion, Parametric và Coercion


Chúng ta sẽ tìm hiểu các loại đa hình (polymorphism) khác nhau. Các loại bao gồm:

  • Ad-Hoc
  • Inclusion
  • Parametric
  • Coercion

Đa hình Ad-Hoc còn gọi là nạp chồng (overloading). Cho phép các hàm cùng tên hoạt động khác nhau cho các kiểu dữ liệu khác nhau. Cả hàm và toán tử đều có thể nạp chồng. Một số ngôn ngữ không hỗ trợ nạp chồng toán tử, nhưng nạp chồng hàm rất phổ biến.

Ví dụ

#include <iostream>
using namespace std;

int add(int a, int b) {
    return a + b;
}

string add(string a, string b) {
    return a + b; // nối chuỗi
}

int main() {
    cout << "Addition of numbers: " << add(2, 7) << endl;
    cout << "Addition of Strings: " << add("hello", "World") << endl;
}

Kết quả

Addition of numbers: 9
Addition of Strings: helloWorld

Đa hình Inclusion còn gọi là subtyping. Cho phép trỏ đến các lớp dẫn xuất bằng con trỏ hoặc tham chiếu lớp cơ sở. Đây là đa hình thời gian chạy. Chúng ta không biết kiểu đối tượng thực tế cho đến khi thực thi. Cần hàm ảo (virtual function) trong C++ để đạt được đa hình inclusion.

Ví dụ

#include <iostream>
using namespace std;

class Base {
public:
    virtual void print() {
        cout << "This is base class." << endl;
    }
};

class Derived : public Base {
public:
    void print() {
        cout << "This is derived class." << endl;
    }
};

int main() {
    Base *ob1;
    Base base_obj;
    Derived derived_obj;
    ob1 = &base_obj; // đối tượng lớp cơ sở
    ob1->print();
    ob1 = &derived_obj; // cùng con trỏ trỏ đến đối tượng dẫn xuất
    ob1->print();
}

Kết quả

This is base class.
This is derived class.

Đa hình Coercion còn gọi là ép kiểu (casting). Loại này xảy ra khi một đối tượng hoặc kiểu nguyên thủy được ép sang kiểu khác. Có hai loại ép kiểu: ép ngầm (implicit) do trình biên dịch thực hiện, và ép tường minh (explicit) dùng const_cast, dynamic_cast, v.v.

Ví dụ

#include <iostream>
using namespace std;

class Integer {
    int val;
public:
    Integer(int x) : val(x) {}
    operator int() const {
        return val;
    }
};

void display(int x) {
    cout << "Value is: " << x << endl;
}

int main() {
    Integer x = 50;
    display(100);
    display(x);
}

Kết quả

Value is: 100
Value is: 50

Đa hình Parametric còn gọi là Early Binding (liên kết sớm). Cho phép dùng cùng một đoạn mã cho các kiểu khác nhau. Đạt được nhờ template (khuôn mẫu).

Ví dụ

#include <iostream>
using namespace std;

template <class T>
T maximum(T a, T b) {
    if(a > b) {
        return a;
    } else {
        return b;
    }
}

int main() {
    cout << "Max of (156, 78): " << maximum(156, 78) << endl;
    cout << "Max of (A, X): " << maximum('A', 'X') << endl;
}

Kết quả

Max of (156, 78): 156
Max of (A, X): X