Convertendo Derived ** para Base ** e Derived * para Base *
Ok, eu estava lendoesta entrada no FQA lidando com a questão da conversão de umDerived**
para umBase**
e por que é proibido, e eu entendi que o problema é que você poderia atribuir a umBase*
algo que não é umDerived*
, então proibimos isso.
Por enquanto, tudo bem.
Mas, se aplicarmos esse princípio em profundidade, por que não estamos proibindo tal exemplo?
void nasty_function(Base *b)
{
*b = Base(3); // Ouch!
}
int main(int argc, char **argv)
{
Derived *d = new Derived;
nasty_function(d); // Ooops, now *d points to a Base. What would happen now?
}
Eu concordo quenasty_function
faz algo idiota, então poderíamos dizer que deixar esse tipo de conversão é bom porque nós permitimos projetos interessantes, mas poderíamos dizer que também para a dupla indireta: você tem umBase **
, mas você não deve atribuir nada à sua deferência, porque você realmente não sabe ondeBase **
vem, assim como oBase *
.
Então, a pergunta: o que há de especial nesse nível extra de indireção? Talvez o ponto é que, com apenas um nível de indireção, poderíamos jogar com virtualoperator=
para evitar isso, enquanto a mesma maquinaria não está disponível em ponteiros simples?