1class Shape {
2public:
3 virtual double Area() { return 1.0; }
4 virtual double Perimeter() { return 1.0; }
5 // Note that destructors generate two entries in the vtable: base object
6 // destructor and deleting destructor.
7 virtual ~Shape() = default;
8};
9
10class Rectangle : public Shape {
11public:
12 ~Rectangle() override = default;
13 double Area() override { return 2.0; }
14 double Perimeter() override { return 2.0; }
15 virtual void RectangleOnly() {}
16 // This *shouldn't* show up in the vtable.
17 void RectangleSpecific() { return; }
18};
19
20// Make a class that looks like it would be virtual because the first ivar is
21// a virtual class and if we inspect memory at the address of this class it
22// would appear to be a virtual class. We need to make sure we don't get a
23// valid vtable from this object.
24class NotVirtual {
25 Rectangle m_rect;
26public:
27 NotVirtual() = default;
28};
29
30int main(int argc, const char **argv) {
31 Shape shape;
32 Rectangle rect;
33 Shape *shape_ptr = ▭
34 Shape &shape_ref = shape;
35 shape_ptr = &shape; // Shape is Rectangle
36 NotVirtual not_virtual; // Shape is Shape
37 return 0; // At the end
38}
39

source code of lldb/test/API/functionalities/vtable/main.cpp