- Trả lời cho cái câu hỏi "đầu tiên" của cậu : lần sau cái này cậu post vào hỏi đáp khác.
- Còn về câu hỏi static binding và dynamic binding : cậu học qua virtual method chưa ?
Đầu tiên là mình muốn nói với admin một câu:Cái email kick hoạt tài khoản của forum sao lại nằm ngay trong mục spam email cua tôi.Cái này admin phải xem lại nha.
____________________________________________
Còn đây là nội dung chính:Có bác nào biết cơ chế kết nối động và cơ chế kết nối tĩnh ko?Cơ chế làm việc của chúng ra sao,trong sách nó ghi ko dễ hiểu mấy nên phải lên đây nhờ cậy anh em.thanks!
- Trả lời cho cái câu hỏi "đầu tiên" của cậu : lần sau cái này cậu post vào hỏi đáp khác.
- Còn về câu hỏi static binding và dynamic binding : cậu học qua virtual method chưa ?
sao cậu này lại nói linh tinh trên diễn đàn thế
hỏi mỗi câu ở tiêu đề rồi post linh tinh,cậu thử nói xem cậu gặp khó khăn ở đâu,công đoạn nào,đang định làm gì mà sao gặp khó để người khác biết cậu đang làm gì chứĐầu tiên là mình muốn nói với admin một câu:Cái email kick hoạt tài khoản của forum sao lại nằm ngay trong mục spam email cua tôi.Cái này admin phải xem lại nha.
rất xin lỗi về việc post nhầm chỗ,nhưng đây ko phải là chủ đề chính.
thực tình thì em đang vướng mắc ở tính đa hình của lập trình hướng đối tượng đây,em cũng đã đọc qua cái virtual method rồi,nhưng em không hiểu ở cái chỗ thế nào là dynamic binding,em ko hiểu cơ chế làm việc của nó.
Trong sách em có ghi thế này:Khi nhận thấy có khai báo virtual trong lớp cơ sở,trình biên dịch sẽ nhận thêm vào mỗi đối tượng của lớp cơ sở và các lớp dẫn xuất của nó một con trỏ chỉ đến băng phương thức ảo(virtual function table).Con trỏ đó có tên là vptr(virtual pointer).Bảng phương thức ảo là nơi chứa các con trỏ chỉ đến đoạn chương trình đã biên dịch ứng với các phương thức ảo.Mỗi lớp có một bảng phương thức ảo.Mỗi phương thức ảo chỉ lập bảng phương thức ảo khi bắt đầu có việc tạddooids tượng của lớp.Đến khi chương trình chạy,phương thức ảo của đối tượng mới được kết nối và thi hành thông qua con trỏ vptr
C++ Code:
#include <iostream> using namespace std; class Base { public : void show( std::ostream& out ) const { out << "I'm Base !"; } }; class Derived : public Base { public : void show( std::ostream& out ) const { out << "I'm Derived !"; } }; void showBaseOrDerive( const Base& obj ) { } int main() { Derived obj; showBaseOrDerive( obj ); return 0; }
- Code trên sẽ in ra derived class. Cái này gọi là binding.
- Khi mà chương trình chạy thì hàm show() của class Base đã được xác định bởi compile cho nên nó sẽ xuất ra "I'm Base" Và cái tiến trình mà để compiler biết hàm nào sẽ được gọi tại compile time gọi là static binding.
- Khi cậu bỏ virtual vào cả 2 thì nó trở thành dynamic binding và compile lúc này nó sẽ biết thằng nào để gọi chính xác, chính là cái v-table mà cậu nói ở trên.
C++ Code:
#include <iostream> using namespace std; class Base { public : void virtual show( std::ostream& out ) const { out << "I'm Base !"; } }; class Derived : public Base { public : virtual void show( std::ostream& out ) const { out << "I'm Derived !"; } }; void showBaseOrDerive( const Base& obj ) { } int main() { Derived obj; showBaseOrDerive( obj ); return 0; }
đối với code thì bạn rox_rook đã đưa ra và giải thích rõ cho bạn về thế nào là static binding và dynamic binding rồi.
mình chỉ xin nói thêm 1 ý nữa là các vptr và vftbl là 2 đối tượng mà trình biên dịch dùng để kiểm soát(quản lý) các hàm virtual(ảo) của chương trình bạn viết ra.
lúc đầu nó sẽ giữ địa chỉ của phương thức ảo trong lớp cơ sở. sau đó ứng với từng đối tượng gọi tương ứng nó sẽ gán chính xác phương thức được override của lớp mà đối tượng đang gọi thuộc về(thông qua các cách cấp phát bộ nhớ).
chúc bạn thành công.