In a program there is an abstraction from an person to a shape. This abstraction is so that collision detection can be performed. Here is my original class hierarchy:

```cpp
namespace Graphics
{

class Shape {
public:
    virtual ~Shape() = default;

    virtual void Draw() = 0;
    virtual bool CheckCollision(float sample_x, float sample_y) = 0;
protected:
    float origin_x, origin_y;
};

class Circle : public Shape {
public:
    virtual ~Circle() = default;

    virtual void Draw();
    virtual bool CheckCollision(float sample_x, float sample_y);
};

class Square : public Shape {
public:
    virtual ~Square() = default;

    virtual void Draw();
    virtual bool CheckCollision(float sample_x, float sample_y);
};

}

class Person : public Graphics::Circle {
public:
    virtual ~Person() = default;

    int GetAge();
    char* GetName();
};

int main()
{
    Person p;
    p.Draw();

    if (p.CheckCollision(10, 10))
    {
        // person collided!
    }

    return 0;
}

```

My question is, is there any way to express such abstractions without using classes? Also is this good design in the first place?