 @startuml

Shape         *-   AbstractShape
AbstractShape <|-- Circle

class Shape {
    - AbstractShape* _p
    + friend bool operator == (const Shape&, const Shape&);
    + friend istream& operator >> (istream&, Shape&)
    + friend ostream& operator << (ostream&, const Shape&)
    + Shape (AbstractShape*)
    + Shape (const Shape&)
    + Shape& operator = (const Shape&)
    + ~Shape ()
    + double area () const
    + void move (int x, int y)
    + void swap (Shape&)
    }

class AbstractShape {
    - int x
    - int y
    + friend bool operator == (const AbstractShape&, const AbstractShape&)
    + friend istream& operator >> (istream&, AbstractShape&)
    + friend ostream& operator << (ostream&, const AbstractShape&)
    # {abstract} virtual bool equals (const AbstractShape&) const
    # {abstract} virtual istream& read (istream&)
    # {abstract} virtual ostream& write const (ostream&)
    + AbstractShape (int x, int y)
    + virtual ~AbstractShape ()
    + {abstract} virtual double area () const
    + {abstract} virtual AbstractShape* clone () const
    + void move (int x, int y)
    }

class Circle {
    - int r
    + friend bool operator == (const Circle&, const Circle&)
    + friend istream& operator >> (istream&, Circle&)
    + friend ostream& operator << (ostream&, const Circle&)
    # bool equals (const AbstractShape&) const override
    # istream& read (istream&) override
    # ostream& write (ostream&) const override
    + Circle (int x, int y, int r)
    + double area () const override
    + Circle* clone () const override
    + int radius () const
    }

@enduml
