| class Shape { |
| public: |
| virtual double Area() { return 1.0; } |
| virtual double Perimeter() { return 1.0; } |
| // Note that destructors generate two entries in the vtable: base object |
| // destructor and deleting destructor. |
| virtual ~Shape() = default; |
| }; |
| |
| class Rectangle : public Shape { |
| public: |
| ~Rectangle() override = default; |
| double Area() override { return 2.0; } |
| double Perimeter() override { return 2.0; } |
| virtual void RectangleOnly() {} |
| // This *shouldn't* show up in the vtable. |
| void RectangleSpecific() { return; } |
| }; |
| |
| // Make a class that looks like it would be virtual because the first ivar is |
| // a virtual class and if we inspect memory at the address of this class it |
| // would appear to be a virtual class. We need to make sure we don't get a |
| // valid vtable from this object. |
| class NotVirtual { |
| Rectangle m_rect; |
| public: |
| NotVirtual() = default; |
| }; |
| |
| int main(int argc, const char **argv) { |
| Shape shape; |
| Rectangle rect; |
| Shape *shape_ptr = ▭ |
| Shape &shape_ref = shape; |
| shape_ptr = &shape; // Shape is Rectangle |
| NotVirtual not_virtual; // Shape is Shape |
| return 0; // At the end |
| } |