Tôi đang cố gắng để undestand một số điều cấp thấp với bảng ảo và thừa kế.Sự hiểu biết về vtable trong các lớp học có nguồn gốc
Khi bạn tạo lớp mới bằng cách kế thừa hai lớp và thêm các hàm ảo mới, nơi chính xác vptr sẽ được lưu trữ?
Dường như với tôi, trình biên dịch đó thực hiện một số 'tối ưu hóa vptr' trong trường hợp đó. Và tôi đang cố gắng tìm ra.
Giả sử, chúng ta có cấu trúc như sau:
struct A
{
int a;
virtual void fa();
};
struct B
{
double b;
virtual void fb();
};
struct C : A, B
{
char c;
virtual void fa();
virtual void fb();
virtual void fc();
};
Trong trường hợp của x86 và align = 4, A
và B
trong bộ nhớ sẽ trông như thế này:
+------+------+
A: | vptr | a |
+------+------+
sizeof(A) = 4 + 4 = 8
+------+------+------+------+
B: | vptr | b |
+------+------+------+------+
sizeof(B) = 8 + 8 = 16
Nhưng khi tôi cố gắng Lắp ráp lại C
, tôi có được điều này:
+------+------+------+------+------+------+------+
C: | vptr | a | vptr | b | c |
+------+------+------+------+------+------+------+
but sizeof(C) = 32
С с;
(C*)&c; // 0x100
(B*)&c; // 0x108
(A*)&c; // 0x100
&c.a; // 0x104
&c.b; // 0x110
&c.c; // 0x118
Vì vậy whe lại là vptr của C
? Tôi có thể cho rằng trình biên dịch rằng hợp nhất bảng ảo khác nhau, nhưng trong trường hợp đó tại sao sizeof(C)
lợi nhuận sizeof(A)
+ sizeof(B)
+ sizeof(alligned_char)
+ sizeof (vptr)
Các struct D : public C {}
có những câu chuyện tương tự (ví dụ vptr của A
và C
.) - có không có vptr của D
.
Trình biên dịch tôi sử dụng là msvc 2012 x86.
tại sao vptr trong struct B cần 8 byte? – walker
@walker Tôi nghi ngờ điều đó. Nó có lẽ là một số đệm. – luk32
Có thể trùng lặp của [Bao nhiêu vptr sẽ là một đối tượng của lớp (sử dụng đơn/đa thừa kế) có?] (Https://stackoverflow.com/questions/3342035/how-many-vptr-will-a-object-of- classuses-single-multiple-inheritance-have) – Andrew