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

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • [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

  • #2
    :shy: Trước giờ thấy ứng dụng của hàm hủy ảo chứ chưa nghe hàm tạo ảo. Hóng thánh trả lời để học thêm
    -Trần Hữu Danh-
    -GameUIT - SE-
    ...Slowly... But Strongly...
    clbgameuit.com F/clbgameuit

    Comment


    • #3
      Ở 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.

      Comment


      • #4
        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


        • #5
          mình có 1 bài viết về vấn đề này, hy vọng đọc xong nó bạn có thể hiểu và giải quyết được vấn đề của bạn :happy:
          IO Stream develops small applications that support the work of professionals and provides useful software for everyone.
          "Measuring programming progress by lines of code is like measuring aircraft building progress by weight." - Bill Gates

          Comment

          LHQC

          Collapse
          Working...
          X