thể trùng lặp:
Understanding the vtable entriesGiải thích về bảng ảo
Sử dụng g ++ phiên bản 4.6.3, máy 64-bit. Tôi biết trình biên dịch là miễn phí để thực hiện các chức năng ảo bất kỳ cách nào nó muốn. Tôi muốn biết chuyện gì đã xảy ra ở đây.
lớp của tôi:
#include <iostream>
class test
{
public:
virtual void func(){std::cout<<"in class test";}
};
int main()
{
test obj;
obj.func();
return 0;
}
Nhìn vào bảng ảo được tạo ra bởi trình biên dịch,
Vtable for test
test::_ZTV4test: 3u entries
0 (int (*)(...))0 (<---- what is this?)
8 (int (*)(...))(& _ZTI4test)
16 (int (*)(...))test::func
Tại bù đắp 8 nó là RTTI
Tại bù đắp 16 nó là mục nhập cho chức năng ảo.
Câu hỏi của tôi là tại sao có mục nhập cho NULL tại offset 0 hoặc nói cách khác mục đích của mục nhập đầu tiên là gì?
P.S. Tôi nghĩ rằng điều này có thể liên quan đến căn chỉnh, nhưng sau đó tôi đã thêm nhiều chức năng ảo nhưng mục nhập RTTI vẫn được bù đắp 8.
Tôi đoán là nó được dành riêng cho trình hủy (mà bạn không thêm). – john
@John, thêm destructor vẫn còn sản lượng tương tự. Ngoài ra, là destructor cần thiết sẽ luôn luôn là một phần của v-table? – Anon
Nó rất phổ biến để có một destructor ảo nếu bạn có bất kỳ chức năng ảo. Nhưng nó không bắt buộc. Oh well đoán của tôi đã sai. – john