¿Es posible devolver una clase abstracta (clase en sí misma o una referencia, no importa) desde una función?devolver una clase abstracta desde una función
Respuesta
Puede devolver un puntero de clase abstracta - asumiendo B
es una clase concreta derivada de la clase abstracta A
:
A * f() {
return new B;
}
o una referencia:
A & f() {
static B b;
return b;
}
o un puntero inteligente:
std::unique_ptr<A> f() {
return std::make_unique<B>(...);
}
Las clases abstractas no se pueden crear instancias y, por lo tanto, no se devuelven.
¿Qué hay de la referencia? Sé que no es posible pasar una clase abstracta como parámetro a una función, pero podría pasar la referencia de la clase abstracta. – cemregoksu
Solo si las referencias se refieren realmente a una instancia de una clase secundaria. –
bueno, ¿qué hay de ese escenario? clase A { virtual void f() = 0; }; void fonk (A & a) {} funciona. entonces ¿es posible formar la función para devolver una referencia de la clase otra vez? – cemregoksu
No, pero una función podría tener un tipo de devolución de un puntero (o una referencia) a una clase abstracta. Luego devolvería instancias de una clase que se deriva de la clase abstracta.
Se refiere a "tipo de retorno de * una referencia a * una clase abstracta". – avakar
No pude entender lo que quieres decir. puedes dar un pequeño ejemplo? – cemregoksu
@incrediman: entonces él está equivocado. – avakar
puede declarar el tipo de devolución para ser una referencia o un puntero a la clase abstracta, de modo que pueda asignarse a referencias o punteros a la clase abstracta y utilizarse en función de su interfaz.
Sin embargo, no puede devolver una instancia real de la clase abstracta real porque, por definición, no puede crear una instancia. Sin embargo, podría devolver instancias de subtipos concretos que sean lo suficientemente buenos porque en el principle of substitution, siempre debería poder usar un subtipo en lugar de un supertipo.
La fábrica patrón de diseño es un ejemplo de devolver un puntero a un objeto de clase de resumen:
class Base
{ ; }
class One : public Base
{ ; }
class Two : public Base
{ ; }
Base * Factory(unsigned int number)
{
Base * p_item(NULL);
switch (number)
{
case 1:
p_item = new One;
break;
case 2:
p_item = new Two;
break;
default:
p_item = NULL;
break;
}
return p_item;
}
Un objeto de la clase base abstracta real nunca puede ser devuelto desde nunca puede haber una ejemplo de una clase base abstracta. Los punteros y las referencias a un tipo base abstracto se pueden devolver como en el ejemplo anterior.
Los punteros y las referencias a una clase base abstracta devuelta por una función o método hacen referencia en realidad a un descendiente del tipo base abstracto.
Sé que voy poco tarde pero espero que esto ayude a alguien ...
Siendo un novato en C++ de programación, también he estado atrapado durante un tiempo en ese problema. Quería crear un método de fábrica que devuelva una referencia a un objeto abstracto. Mi primera solución con punteros funcionó bien, pero quería mantenerme en una forma más "C++". Aquí está el fragmento de código que escribí para demostrarlo:
#include <iostream>
using std::cout;
using std::endl;
class Abstract{
public:
virtual void foo() = 0;
};
class FirstFoo: public Abstract{
void foo()
{
cout << "Let's go to the foo bar!" << endl;
}
};
class SecondFoo: public Abstract{
void foo()
{
cout << "I prefer the foo beer !" << endl;
}
};
Abstract& factoryMethod(){
static int what = 0;
if(what++ % 2 == 0)
return *(new FirstFoo());
else
return *(new SecondFoo());
}
int main(int argc, char* argv[])
{
int howMany = 10;
int i = 0;
while(i++ < howMany)
{
Abstract& abs = factoryMethod();
abs.foo();
delete &abs;
}
}
¡Abierto a cualquier crítica!
'factoryMethod' pierde memoria cada vez que lo llamas. El resultado se asigna en el montón, pero nunca se elimina. (La persona que llama no puede eliminarlo porque obtiene una referencia en lugar de un puntero). –
En C++ 11, std :: unique_ptr funciona. – user877329
Estoy de acuerdo con el problema de la pérdida de memoria, pero aprendí cómo importar símbolos específicos de un espacio de nombres usando 'using', ¡hasta ahora solo sabía sobre' using namespace'! Gracias por ese @morandg! – stakx
- 1. devolver una lista de clase abstracta
- 2. ¿Cómo devolver una matriz desde una función?
- 3. JQUERY + devolver una matriz desde una función
- 4. ¿Cómo devolver diferentes clases desde una función?
- 5. Devolver múltiples valores desde una función C
- 6. Devolver Tipo anónimo desde una función
- 7. serialización de una clase abstracta
- 8. ¿Cómo devolver una matriz desde una función Delphi?
- 9. manera correcta devolver una cadena desde una función
- 10. PHP - Error al devolver una matriz desde una función recursiva
- 11. Unidad probando una clase que hereda de una clase abstracta
- 12. Heredar de una clase o una clase abstracta
- 13. php clase abstracta extendiendo otra clase abstracta
- 14. Derivando una clase abstracta de la clase concreta
- 15. Devolver objeto desde la función
- 16. ¿Puede una clase abstracta extender otra clase abstracta y aumentar la funcionalidad?
- 17. Cómo devolver un literal de cadena desde una función
- 18. Cómo devolver el valor varchar desde una función
- 19. QTP: ¿Cómo puedo devolver múltiples valores desde una función
- 20. ¿Cómo devolver un valor booleano desde una función en MySQL?
- 21. ¿es posible no devolver nada desde una función en python?
- 22. ¿Por qué no puedo devolver responseText desde una función Ajax?
- 23. función Mysql devolver un valor desde una consulta
- 24. ¿Cómo implementar una clase abstracta en ruby?
- 25. ¿Cómo implementar una clase abstracta en F #?
- 26. Cómo y cuándo usar una clase abstracta
- 27. Usando un método de una clase abstracta
- 28. Django: consultar una clase base abstracta
- 29. Python - Prueba de una clase base abstracta
- 30. Método vacío en una clase abstracta
quiero usar la clase abstracta en sí misma (o su referencia), para usarla como una forma genérica para otras clases que se derivan de esa clase abstracta – cemregoksu
@cemregoksu Ese es el único propósito para tener un resumen clase. Ambas funciones ilustran cómo lo haría con respecto a los valores de retorno de función. –
gracias por su ayuda. Creo que funcionó =) – cemregoksu