¿Cómo devolver derivado de una función como referencia a Base?
Quiero implementar una función que devuelva una referencia a Base
que en realidad comprende Derived
(los tipos son polimórficos). Algo así como el siguiente código (incorrecto):
struct Base { virtual ~Base() {} };
struct Derived: Base { int x = 5;};
const Base& get() {
Derived d = {};
const Base& b = d;
return b;
}
int main() {
const Base& b = get();
const auto* a = dynamic_cast<const a*="">(&b);
}
OBVIAMENTE, este código causa un comportamiento indefinido, ya que b
en main
es una referencia colgante.
Entonces, supongo que el principal obstáculo es el siguiente:
- Para ~pasar
Derived
comoBase
~, necesitamos crear una referencia. No se puede devolver una referencia a una variable local desde una función, ya que estaría haciendo referencia a una memoria desalocada de la pila.
¿Hay alguna solución para este problema (como usar punteros en lugar de referencias u algo así)?
davy.ai
Sí, hay soluciones alternativas para este problema. Una solución es usar un puntero en lugar de una referencia y asignar el objeto de manera dinámica en el montón para asegurarse de que persista más allá del alcance de la función. Aquí tienes un ejemplo de implementación:
En este ejemplo, la función
get
crea un nuevo objetoDerived
en el montón utilizandonew
, lo asigna a un punteroBase
y devuelve ese puntero. Enmain
, podemos realizar un cast seguro deb
a un punteroDerived
utilizandodynamic_cast
, ya que sabemos que apunta a un objetoDerived
. Finalmente, debemos recordar eliminar la memoria asignada utilizandodelete
.