If this is your first visit, be sure to
check out the FAQ by clicking the
link above. You may have to register
before you can post: click the register link above to proceed. To start viewing messages,
select the forum that you want to visit from the selection below.
Announcement
Collapse
No announcement yet.
Sự khác nhau giữa gọi hàm ảo trong constructor và trong hàm member thường của class
[C++]
Sự khác nhau giữa gọi hàm ảo trong constructor và trong hàm member thường của class
Cho em xin hỏi sự khác nhau giữa gọi hàm ảo trong constructor và trong hàm member thường của class Hoặc là giảng rõ hơn về bản chất hay quá trình gọi virtual func trong constructor?
Em cảm ơn
Ở trong ngôn ngữ C++ (Có thể khác với một số ngôn ngữ khác), khi khởi tạo một đối tượng, lớp cha (Base class) của đối tượng sẽ được khởi tạo trước, sau khi khởi tạo hoàn tất Base class, các lớp thừa kế (Derived class) sau nó sẽ được khởi tạo.
Như vậy, nếu gọi 1 Virtual function trong constructor của class mà không thông qua một Derived class thì ở đây không xảy ra vấn đề gì. Tuy nhiên nếu bạn khởi tạo một đối tượng của Derived Class thì sẽ gặp trường hợp sau:
- Nếu Virtual function của bạn không được override thì sẽ không có chuyện gì khác thường xảy ra.
- Nếu Virtual function được override ở Derived class, lúc này Base Class đang được khởi tạo, nó không biết là có Derived Class hay là Virtual function đã được override ở đây, vì vậy nếu gọi Virtual function ở đây, nó sẽ gọi virtual function của Base class chứ không phải của Derived Class vì Derived class vẫn chưa được khởi tạo.
Còn nếu bạn gọi ở một hàm thành viên thì nó đơn giản thôi, đối tượng đã được khởi tạo hoàn thành, nó sẽ tự biết phải gọi virtual function của mức thừa kế nào nếu bạn không chỉ định.
Trước tiên phải nói mục tiêu của hàm ảo ứng dụng trong OOP là khi có sự kế thừa của một cây phả hệ.
cơ chế của virtual function là khi compile nhận thấy có khai báo virtual trong lớp base. Thì complie sẽ tự động tạo ra một con trỏ trỏ đến một bảng bảng phương thức ảo. Bảng phương thức ảo là nơi chưa các con trỏ trỏ đến các function đã được compile (nghĩa là lớp base và lớp derived chung một tên function nhưng trông mỗi class lại có một con trỏ trỏ đến function của chính mình. Hay còn gọi là override. Nên nó có thể tự động gọi đến function của class đó tự động).
mỗi lớp chỉ có một virtual function table.
chính vì một lớp chỉ có một virtual function table. Trong khi có thể tạo nhiều đối tượng thuộc một lớp. Nên virtual function table được tạo ra trước khi đối object được tạo lập. Nên không thể có constructor ảo.
Comment