============================================================
 INHERITANCE BASICS — SHAPE HIERARCHY - Demo Run
============================================================

--- Polymorphic describe() across all shape types ---
  Circle: area=78.54, perimeter=31.42
  Rectangle: area=24.00, perimeter=20.00
  Square: area=16.00, perimeter=16.00
  Triangle: area=24.00, perimeter=24.00

--- Square correctly reuses Rectangle via super().__init__() ---
  Square(5): width=5, height=5, area=25

============================================================
 Assignment: Cylinder via COMPOSITION (contains a Circle, doesn't inherit from it)
============================================================
  Cylinder(radius=3, height=10):
    volume = 282.74
    surface_area = 245.04
  (Uses cyl.base.area() and cyl.base.perimeter() internally --
   the Circle's own logic is reused via composition, not duplicated.)
