Announcement

Collapse
No announcement yet.

Vtable và virtual inheritance trong lập trình hướng đối tượng C++

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

  • [C++] Vtable và virtual inheritance trong lập trình hướng đối tượng C++

    Kính chào các thầy cô, anh, chị và các bạn!

    Mọi người đều biết vtable sẽ được sinh ra cho mỗi class có phương thức ảo(hoặc class kế thừa từ một class khác có phương thức ảo).
    Mỗi vtable sẽ chứa các con trỏ hàm trỏ đến các phương thức ảo đồng thời mỗi đối tượng thuộc class(kể cả class cha và class con)
    sẽ có kích thước tăng thêm 4byte(hoặc 2bytes tùy hệ điều hành) để chứa vpointer(con trỏ đến vtable), nhờ vpointer và vtable và
    dynamic binding(hay còn gọi là late binding) mà phương thức cần gọi sẽ được gọi một cách chính xác( gọi là đa hình).

    Ngoài ra, vtable và vpointer còn "xuất hiện" trong kế thừa ảo(virtual inheritance, dùng để giải quyết vấn đề hình thoi trong đa kế thừa)
    và do đó cũng là tăng kích thức của các đối tượng thuộc lớp kế thừa ảo đó(để chưa vpointer). Em chỉ biết có đến đây, và cũng đã tìm
    hiểu xem nó hoạt động ra làm sao. google search có rất nhiều kết quả chẳng hạn https://www.cprogramming.com/tutoria...heritance.html,
    hoặc https://stackoverflow.com/questions/...d-in-compilers và một số trang web khác nhưng
    em vẫn chưa thực sự hiểu "CHÍNH XÁC THÌ VTABLE VÀ VPOINTER ĐÃ HOẠT ĐỘNG NHƯ THẾ NÀO ĐỂ GIẢI QUYẾT VẤN ĐỀ HÌNH THOI???".
    Mong thầy cô, anh chị, các bạn chỉ giáo giúp em phần này ạ?
    Thank all!

  • #2
    "CHÍNH XÁC THÌ VTABLE VÀ VPOINTER ĐÃ HOẠT ĐỘNG NHƯ THẾ NÀO ĐỂ GIẢI QUYẾT VẤN ĐỀ HÌNH THOI???".
    Câu hỏi khá hay nhưng vẫn còn chung chung, để nói về vấn đề này thì rất dài, bạn nên tự tìm hiểu thêm.

    Comment


    • #3
      Hy vọng bài này giải quyết được phần nào thắc mắc của bạn: http://www.learncpp.com/cpp-tutorial...virtual-table/

      Comment


      • #4
        Cảm ơn anh! Em đã đọc qua nhưng cái bài viết này chỉ là mô tả cách vtable thực hiện đa hình như thế nào? Chứ việc "vtable đã giải quyết vấn đề hình thoi trong đa kế thừa như thế nào?" thì bài
        này em không thấy đề cập.

        Comment


        • #5
          Originally posted by 16521615 View Post
          Cảm ơn anh! Em đã đọc qua nhưng cái bài viết này chỉ là mô tả cách vtable thực hiện đa hình như thế nào? Chứ việc "vtable đã giải quyết vấn đề hình thoi trong đa kế thừa như thế nào?" thì bài
          này em không thấy đề cập.
          Để mọi người có cơ sở thảo luận hơn, tránh hiểu nhầm ý nhau tui nghĩ trước tiên em nên phát biểu lại "vấn đề hình thoi". Chứ ghi một câu hỏi quá rộng lớn như vậy mà không kèm theo giải nghĩa rõ hơn tui sợ mọi người hông dám trả lời liền đâu.

          Comment


          • #6
            Originally posted by truonganpn View Post
            Để mọi người có cơ sở thảo luận hơn, tránh hiểu nhầm ý nhau tui nghĩ trước tiên em nên phát biểu lại "vấn đề hình thoi". Chứ ghi một câu hỏi quá rộng lớn như vậy mà không kèm theo giải nghĩa rõ hơn tui sợ mọi người hông dám trả lời liền đâu.
            Dạ chào thầy! Thầy có cái tài liệu(hoặc bài viết) nào nói về vấn đề này không cho em tham khảo với ạ!

            Comment


            • #7
              Originally posted by 16521615 View Post
              Dạ chào thầy! Thầy có cái tài liệu(hoặc bài viết) nào nói về vấn đề này không cho em tham khảo với ạ!
              Ủa em đọc post trước tui chưa vậy, tui đang hỏi thêm thông tin mà ?

              Comment


              • #8
                Originally posted by truonganpn View Post
                Ủa em đọc post trước tui chưa vậy, tui đang hỏi thêm thông tin mà ?
                Dạ! vấn đề hình thoi em nghĩ thầy đã biết, nhưng do câu hỏi em thiếu thông tin và thầy muốn em nói rõ hơn nên em bổ sung như sau:
                Vấn đề hình thoi có thể lấy ví dụ như sau:
                Giả sử ta có class A có phương thức M(phạm vi truy cập là public)
                class B và class C đồng thời kế thừa( public) từ class A.
                class D kế thừa đồng thời từ class B và C.
                Khi ta tạo một đối tượng d thuộc class D, nếu ta dùng d để gọi phương thức M(tức là dùng câu lệnh d.M()) thì trình biên dịch báo lỗi
                cụ rằng việc gọi phương thức M là mơ hồ. Vấn đề trên thường được gọi là vấn đề hình thoi trong đa kế thừa trong lập trình C++.

                Comment


                • #9
                  http://www.geeksforgeeks.org/multiple-inheritance-in-c/

                  Comment

                  LHQC

                  Collapse
                  Working...
                  X