Brief Guide to CLOS: Inheritance of slot options

## 4. Inheritance of slot options

The class above had no superclass. That's why there was a `"()"` after `"defclass person"`. Actually, this means it has one superclass: the class `STANDARD-OBJECT`.

When there are superclasses, a subclass can specify a slot that has already been specified for a superclass. When this happens, the information in slot options has to be combined. For the slot options listed above, either the option in the subclass overrides the one in the superclass or there is a union:

:ACCESSOR

  union

:INITARG

  union

:INITFORM

  overrides

This is what you should expect. The subclass can change the default initial value by overriding the `:INITFORM`, and can add to the initargs and accessors.

However, the "union" for accessor is just a consequence of how generic functions work. If they can apply to instances of a class C, they can also apply to instances of subclasses of C.

(Accessor functions are generic. This may become clearer once generic functions are discussed, below.)

Here are some subclasses:

> `

>     <cl> (defclass teacher (person)
>           ((subject :accessor teacher-subject
>                     :initarg :subject)))
>     #<clos:standard-class teacher @ #x7cf796>

>     #<cl> (defclass maths-teacher (teacher)
>            ((subject :initform "Mathematics")))
>     #<clos:standard-class maths-teacher @ #x7d94be>

>     <cl> (setq p2 (make-instance 'maths-teacher
>                      :name 'john
>                      :age 34))
>     #<maths-teacher @ #x7dcc66>

>     <cl> (describe p2)
>     #<maths-teacher @ #x7dcc66>; is an instance of
>          class #<clos:standard-class maths-teacher @ #x7d94be>:
>      The following slots have :INSTANCE allocation:
>      age        34
>      name       john
>      subject    "Mathematics"

> `

Note that classes print like `#<clos:standard-class maths-teacher @ #x7d94be>`. The `#<...>` notation usually has the form

> `

>     #<class-of-the-object ... more information ...>

> `

So an instance of maths-teacher prints as `#<MATHS-TEACHER ...>`. The notation for the classes above indicates that they are instances of `STANDARD-CLASS`. `DEFCLASS` defines standard classes. `DEFSTRUCT` defines structure classes.