Fala Biel, beleza?
Você salvaria os funcionários em uma única tabela, de maneira normal, você poderia modelar o banco contendo uma tabela para os funcionários e outra para os cargos(que representa os tipos de funcionários). A sua camada de persistência analisaria o tipo de instância de objeto que você quer salvar, relacionaria com o cargo correspondente e realizaria a persistência.
Vou tentar exemplificar de maneira bem resumida, pode conter inconsistências, é apenas para dar uma noção:
//camada da aplicação
$repositorio->adiciona(new Gerente('Fulano', 'Gerente'));
//camada de persistencia dentro da classe de repositório
public function adiciona(Funcionario $funcionario): void
{
$sql = "INSERT INTO funcionarios (nome, cargo) VALUES (:nome, :cargo)";
// aqui realizaria a estrategia para descobrir qual tipo de cargo
// tem estratégias melhores, apenas para dar um exemplo
switch($funcionario->cargo()){
case 'Desenvolvedor':
$cargo = 1;
break;
case 'Gerente':
$cargo = 2;
break;
default:
$cargo = 0;
}
$this->pdo->prepare($sql);
$this->pdo->bindValue(':nome', $funcionario->nome());
$this->pdo->bindValue(':cargo', $cargo);
//restante do código
}
Era essa sua dúvida? Eu modelaria as classes de maneira diferente, acho redundante passar o tipo de cargo sendo que a classe já representa o cargo, mas provavelmente foi feito dessa maneira para simplificar o entendimento. Não fiz esse treinamento então posso ter entendido errado a dúvida, qualquer coisa estou a disposição.