2011-01-11 34 views
11

Con trỏ ảo là gì? Xin chào, TẤT CẢ, Hôm nay tôi đã có một cuộc phỏng vấn qua điện thoại và có một câu hỏi: "Con trỏ ảo là gì?" Tôi tình cờ gặp vấn đề này, vì vậy sau khi nó kết thúc, tôi đã thử Google. Thật không may, nó đã cho tôi một tài liệu tham khảo bảng ảo chỉ.Con trỏ ảo

Vì vậy, con trỏ ảo bằng tiếng Anh đơn giản là gì? Bạn định nghĩa nó như thế nào?

Cảm ơn bạn.

+5

Theo như tôi biết, không có điều như vậy, trừ khi người phỏng vấn của bạn đang nói về một mục duy nhất trong cấu trúc vtbl. –

+1

Con trỏ * bảng * ảo? –

+0

Đó là một câu hỏi phỏng vấn nâng cao để thăm dò xem bạn biết rõ chi tiết triển khai mô hình đối tượng C++ như thế nào. –

Trả lời

14

Không có thứ như "con trỏ ảo".

Có một vài điều người phỏng vấn có thể có nghĩa là:

  • Một con trỏ tới một lớp đa hình
  • Một con trỏ tới vtable của một lớp đa hình (@Maxim tín dụng)
  • Một con trỏ vào trong vtable của một lớp đa hình
  • Đối tượng con trỏ thông minh có ghi đè operator->
  • Con trỏ đến hàm thành viên ảo (credit @ Matthieu M)

Nhưng theo như "con trỏ ảo" là có liên quan, không có điều đó.

+0

@John: Tôi sẽ thêm, trỏ tới hàm thành viên ảo vào danh sách các khả năng có khả năng. –

+0

@Matthieu: Đề xuất hay, chỉnh sửa. –

+0

Bạn rất có thể sẽ không thực hiện được cuộc phỏng vấn bằng một trong các câu trả lời ở trên. –

4

Giải thích của tôi sẽ là: nội dung của vtable — con trỏ tới các phương thức ảo.

Không phải là từ ngữ hay, IMHO.

1

Nó cũng có thể có nghĩa là tạo ra một con trỏ hàm của ảo/ảo tinh khiết của phương pháp của một người cha và gọi nó với một đứa trẻ, nó vẫn không phải là một từ ngữ tốt ...

2

C++ biên dịch tạo ra một thành viên lớp ẩn có tên ảo -pointer hoặc trong vptr ngắn khi có một hoặc nhiều hàm ảo. Vptr này là một con trỏ trỏ đến một bảng các con trỏ hàm. Bảng này cũng được tạo bởi trình biên dịch và được gọi là bảng chức năng ảo hoặc vtable. Mỗi hàng của vtable là một con trỏ hàm trỏ đến một hàm ảo tương ứng.

Để hoàn thành việc ràng buộc trễ, trình biên dịch tạo bảng vtable này cho mỗi lớp có chứa các hàm ảo và cho lớp bắt nguồn từ nó. Trình biên dịch đặt địa chỉ của các hàm ảo cho lớp cụ thể đó trong ‘vtable’. Khi gọi hàm ảo được thực hiện thông qua một con trỏ cơ sở, trình biên dịch sẽ chèn mã để tìm VPTR và tra cứu địa chỉ hàm trong VTABLE, do đó gọi hàm đúng và gây ra ràng buộc trễ/động sẽ diễn ra .

Các vấn đề liên quan