5 .3| Cerr và clog
5.4 .12| Static binding và Dynamic binding
Binding (sự liên kết): là mối liên quan giữa định nghĩa hàm (function definition)
và việc gọi của hàm (function call) hay mối liên quan giữa biến (variable) và giá trị (value). Có hai loại ràng buộc:
Tài liệu giảng dạy Kỹ Thuật Lập Trình 2 Trang 114
Static binding (liên kết tĩnh): Khi trình biên dịch xác nhận tất cả các thông tin
cần thiết để gọi một hàm hoặc tất cả các giá trị của các biến trong thời gian biên dịch (compile time), nó được gọi là "ràng buộc tĩnh”.
Ví dụ: việc nạp chồng (overloading) hàm, toán tử
− Static binding làm cho chương trình chạy nhanh hơn
Dynamic binding (liên kết động): Việc gọi một hàm hoặc gán một giá trị cho một biến, tại thời gian chạy (run-time) được gọi là "Dynamic Binding".
− Ví dụ: dynamic binding xảy ra khi sử dụng virtual base class trong inheritance và virtual functions trong polymorphism.
− Dynamic binding làm cho chương trình linh hoạt hơn vì có khả năng chọn lựa giá trị cho biến hoặc hàm nào được gọi trong thời gian chương trình đang chạy
− Một non-static base class kiểu protected có thể được truy cập bởi các thành viên khác của lớp, các derived class hoặc friend class theo các cách sau:
• Sử dụng con trỏ trực tiếp hoặc gián tiếp đến derived class • Sử dụng tham chiếu tiếp hoặc gián tiếp đến derived class • Một object trực tiếp hoặc gián tiếp của derived class.
− Nếu một class kế thừa kiểu private từ base class, thì tất cả các thành viên protected của base class members trở thành private members của derived class. Ví dụ 1: class A { public: protected: int i; }; class B : public A {
friend void f(A*, B*); void g(A*);
Tài liệu giảng dạy Kỹ Thuật Lập Trình 2 Trang 115
• B kết thừa public từ A nên các thành viên của B truy cập được các thành viên protected của A.
• f() là hàm bạn của lớp B.
Ví dụ 2:
void f(A* pa, B* pb) { // pa->i = 1; pb->i = 2;
// int A::* point_i = &A::i; int A::* point_i2 = &B::i; }
void B::g(A* pa) { // pa->i = 1; i = 2;
// int A::* point_i = &A::i; int A::* point_i2 = &B::i; }
void h(A* pa, B* pb) { // pa->i = 1; // pb->i = 2; }
• Trình biên dịch khơng chấp nhận câu lệnh : pa->i = 1;
• Vì pa khơng là con trỏ đến lớp B, nhưng chấp nhận i = 2 vì nó tương đương this->i = 2