@startuml

Interface <|-- A: Inheritance
Interface o-- D: Aggregation
Interface <-- D: Association
Interface <|-- D: Inheritance
D <|-- X: Inheritance
D <|-- Y: Inheritance
D <|-- Z: Inheritance

D <.. X: Dependency
D <.. Y: Dependency
D <.. Z: Dependency

note "wrappee->foo()" as n1
D -right-> n1

class Interface
{
    -- Contructors & destructors --
    - Interface()
    
    -- Public methods --
    + foo() : virtual void
}

class A
{
    -- Contructors & destructors --
    - A()
    
    -- Public methods --
    + foo() : virtual void
}

class D
{
    -- Contructors & destructors --
    - D()
    
    -- Public methods --
    + foo() : virtual void
}


class X
{
    -- Contructors & destructors --
    - X()
    
    -- Public methods --
    + foo() : virtual void
}

class Y
{
    -- Contructors & destructors --
    - Y()
    
    -- Public methods --
    + foo() : virtual void
}

class Z
{
    -- Contructors & destructors --
    - Z()
    
    -- Public methods --
    + foo() : virtual void
}


@enduml
