Я нахожу вопрос плохо сформулированным, дизайн может серьезно измениться, просто добавив небольшую дополнительную информацию.
Исходя из того, что вы написали, я мог бы подумать о создании следующих классов ('-' означает extends):
Company
AbstractCollaborator (Chief member, CalculateSalary() { return base + AdditionalSalary() }, abstract AdditionalSalary())
- Chief
- AbstractLeader ( List subordinates )
-- Sales
-- Manager
- Employee
У шефа не было бы шефа, настроенного на себя. Я бы попытался запретить использование виртуальных функций и вместо этого попытался бы использовать абстрактные функции.
Другой вариант - просто использовать один класс. Хорошо, что только у менеджера по продажам или менеджера могут быть подчиненные, но в реальной ситуации кому-то могут понадобиться подчиненные. Вместо этого можно просто указать функцию любого типа сотрудника.
Все зависит от того, куда вы идете с этим ...