Conversión de Derivado ** a Base ** y Derivado * a Base *

Ok estaba leyendo todoesta entrada en la FQA tratar sobre el tema de la conversión de unaDerived** a unBase** y por qué está prohibido, y entendí que el problema es que se podría asignar a unBase* algo que no es unDerived*, así que prohibimos eso.

Hasta ahora tan bueno.

Pero, si aplicamos ese principio en profundidad, ¿por qué no estamos prohibiendo ese ejemplo?

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?
}

Estoy de acuerdo quenasty_function hace algo idiota, así que podríamos decir que dejar ese tipo de conversión está bien porque habilitamos diseños interesantes, pero también podemos decir que para la doble dirección: tienes unaBase **, pero no debes asignar nada a su deferencia porque realmente no sabes dónde estáBase ** viene, al igual que elBase *.

Entonces, la pregunta: ¿qué tiene de especial ese nivel adicional de indirección? Quizás el punto es que, con solo un nivel de direccionamiento indirecto, podríamos jugar conoperator= para evitar eso, mientras que la misma maquinaria no está disponible en punteros simples?

Respuestas a la pregunta(6)

Su respuesta a la pregunta