跳转至

单继承

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()