Основная парадигма наследования:сделать почти такой как нам надо класс, таким как нам надоОсновная парадигма наследования (по Страуструпу, конечно!) - "... сделать почти такой как нам надо класс, таким как нам надо". Проще,- создание специализированной версии на основе старой (исходной). .

Например, если имеется класс employee (работников вообще):.

empl <- list(name = "Serg", salary = 25000, union = F)
class(empl) <- c("employer")
,

то наследника с почасовой ставкой можно сделать следующим образом:

nempl <- list(name = "Serg", salary = 25000, union = F, hrate = 2.54)
class(nempl <- c("hemployee", "employee")

Новый класс наследует методы класса родителя, т.е. схема наследования здесь классическая.
Классическая схема наследования в полном соответствии с основными свойствами ООП
рис.1

И print.employee() работает и для hemployee, но в полном соответствии с основными свойствами ООП вывод не коснется переменной hrate (если реализация print.employee() существует):

> hempl
serg
salary 25000
union member FALSE

Схема работы здесь следующая:
>hempl вызывает print(hempl). Примитив UseMethod() начинает искать реализацию print.hemployee(), которой не существует.Тогда UseMethod выполняет поиск по второму имени в списке функций class()<- и находит print.employee(), который не знает о переменной hrate. Этот метод и будет выполнен..

В функции lm есть строка, которая формирует специальный символьный класс "lm", с наследником - матричной lm - "mlm":.


class(z) <- c(if(is,matrix(y)) "mlm","lm").

Такая конструкция сообщает достаточную гибкость в работе с различными объектами.