Fiz alguns testes com este problema de overloading, e pude constatar que a necessidade de cast só ocorre em usos no mesmo escopo, e não na implementação.
Salvei um git com os exemplos, também colocarei os trechos do meu código aqui.
Primeiro tive o erro demonstrado na aula, nas linhas 63 e 96 dos links abaixo:
(Banco::Conta&) corrente1 += 90;
corrente3 += corrente2;
Como experimento eu propositalmente dupliquei o código e usei em conta poupança, que para a minha surpresa não deu erro, e assim não precisei de cast, isso na linha: 111: https://github.com/adrianowead/estudo-cpp/blob/6104d92104688e27bdcdaabc6957fa2f676742a5/src/Banco/Banco/main.cpp#L111
poupanca2 += poupanca1;
Ai veio a dúvida, a linguagem não permite uso dos dois tipos baseado unicamente no escopo?
Então fiz uma função de testes na linha 28: https://github.com/adrianowead/estudo-cpp/blob/6104d92104688e27bdcdaabc6957fa2f676742a5/src/Banco/Banco/main.cpp#L28
void testarOperatorEmOutroEscopo(Banco::Conta& conta)
{
conta += 90;
}
E consumi ela na linha 67 utilizando a mesma conta corrente em que foi necessário o cast: https://github.com/adrianowead/estudo-cpp/blob/6104d92104688e27bdcdaabc6957fa2f676742a5/src/Banco/Banco/main.cpp#L67
testarOperatorEmOutroEscopo(corrente1);
E sim, o erro ocorre então ao utilizar o operador overload da classe base Conta, misturado com a implementação das classes filhas. Mas não só isso, se o mesmo tipo de filha usar as duas implementações. Ou seja, se no mesmo escopo a conta corrente usar apenas uma das implementações, não haverá qualquer conflito.
Então para evitar a necessidade de cast, basta direcionar os usos para escopos distintos.
Apesar da constatação, vou deixar postado aqui como dúvida, pois como ainda não manjo muito da linguagem não sei se a análise está correta.