单继承
Example¶
C++
class X {
public:
virtual void foo();
double i;
};
class A: public X {
public:
double j;
virtual void bar();
};
void test() {
A a;
}
gcc¶
Bash
g++ -fdump-class-hierarchy -c single.cpp
cat single.cpp.002t.class
Vtable for X
X::_ZTV1X: 3u entries
0 (int (*)(...))0
8 (int (*)(...))(& _ZTI1X)
16 (int (*)(...))X::foo
Class X
size=16 align=8
base size=16 base align=8
X (0x0x3fff71ee04e0) 0
vptr=((& X::_ZTV1X) + 16u)
Vtable for A
A::_ZTV1A: 4u entries
0 (int (*)(...))0
8 (int (*)(...))(& _ZTI1A)
16 (int (*)(...))X::foo
24 (int (*)(...))A::bar
Class A
size=24 align=8
base size=24 base align=8
A (0x0x3fff71ed00d0) 0
vptr=((& A::_ZTV1A) + 16u)
X (0x0x3fff71ee0540) 0
primary-for A (0x0x3fff71ed00d0)
clang¶
Bash
clang++ -Xclang -fdump-record-layouts -c single.cpp
*** Dumping AST Record Layout
0 | class X
0 | (X vtable pointer)
8 | double i
| [sizeof=16, dsize=16, align=8,
| nvsize=16, nvalign=8]
*** Dumping AST Record Layout
0 | class A
0 | class X (primary base)
0 | (X vtable pointer)
8 | double i
16 | double j
| [sizeof=24, dsize=24, align=8,
| nvsize=24, nvalign=8]
Bash
clang++ -Xclang -fdump-vtable-layouts -c single.cpp
Vtable for 'A' (4 entries).
0 | offset_to_top (0)
1 | A RTTI
-- (A, 0) vtable address --
-- (X, 0) vtable address --
2 | void X::foo()
3 | void A::bar()
VTable indices for 'A' (1 entries).
1 | void A::bar()
Vtable for 'X' (3 entries).
0 | offset_to_top (0)
1 | X RTTI
-- (X, 0) vtable address --
2 | void X::foo()
VTable indices for 'X' (1 entries).
0 | void X::foo()