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?

questionAnswers(6)

yourAnswerToTheQuestion