Liên kết động trong C++

Liên kết động trong C++

Có thể nhiều bạn đã từng sử dụng đa hình, viết hàm ảo ở các class cho kết thừa rồi overwrite, implement lại phương thức và sử dụng chúng. Có thể các bạn đã sử dụng liên kết động mà không biết mình đang dùng.
Liệt kết động (tiếng anh là dynamic binding cũng có thể gọi late binding, runtime binding), cơ chế này tức là kiểu dữ liệu cụ thể của object nào đó chỉ được xác định cụ thể ở lúc chương trình chạy và hàm đúng của nó sẽ được gọi chứ lúc biên dịch thì đối tượng cụ thể thì vẫn chưa được xác định.
Một ví dụ sử dụng liên kết động:

#include 
class A {
public:
    virtual void process() {
        std::cout << "Process of A" << std::endl;
    }
};
class B :public A {
public:
    void process() {
        std::cout << "Process of B" << std::endl;
    }
};
int main() {
    
    //dynamic binding
    A * p1 = new B;
    p1->process();
    A & p2 = B();
    p2.process();

    // static binding, cũng có người gọi early binding
    A p3 = B();
    p3.process();
    system("pause");
    return 0;
}

khi chương trình chạy, thì hàm đúng của kiểu dữ liệu B sẽ được gọi chứ không phải hàm của kiểu A mặc dù p1 là con trỏ của class A, còn p2 lại là một reference (tham chiếu) được khai báo là kiểu A bởi là nhờ cơ chế dynamic binding. Còn đối với p3 thì cái dùng này sẽ xác định cứng kiểu của p3 luôn là A và chỉ có hàm của A được gọi.