Supongamos foo
es un resumen class
en un programa en C++, ¿por qué es aceptable para declarar variables de tipo foo*
, pero no de tipo foo
?declaraciones de clases abstractas en C++
Respuesta
Porque si declara un foo debe inicializarlo/instanciarlo. Si declara un * foo, puede usarlo para apuntar a instancias de clases que heredan de foo pero no son abstractas (y así pueden crearse instancias)
Porque un puntero a un foo no es un foo - están completamente diferentes tipos. Hacer un resumen de clase dice que no puede crear objetos del tipo de clase, no que no puede crear punteros (o referencias) para la clase.
Asimismo, puesto que las clases abstractas se utilizan generalmente como padres (clases base - de ABC), que se utiliza para polymorphisem
class Abstract {}
class DerivedNonAbstract: public Abstract {}
void CallMe(Abstract* ab) {}
CallMe(new DerivedNonAbstract("WOW!"));
No se puede crear una instancia de una clase abstracta. Y hay diferencias entre las siguientes declaraciones.
// declares only a pointer, but do not instantiate.
// So this is valid
AbstractClass *foo;
// This actually instantiate the object, so not valid
AbstractClass foo;
// This is also not valid as you are trying to new
AbstractClass *foo = new AbstractClass();
// This is valid as derived concrete class is instantiated
AbstractClass *foo = new DerivedConcreteClass();
Porque si declaramos que foo Meanz estamos creando una instancia de la clase foo que es un resumen, y es imposible crear la instancia de una clase abstracta. Sin embargo, podemos utilizar el puntero de una clase abstracta para apuntar a sus clases de unidad para aprovechar las ventajas del polimorfismo. . .
- 1. C# Propiedades en clases base abstractas
- 2. ¿Las clases abstractas pueden implementarse en C#?
- 3. ¿Constructores en clases abstractas?
- 4. Interfaces vs. clases abstractas
- 5. Clases selladas abstractas
- 6. ¿Múltiples clases abstractas derivadas?
- 7. Cómo crear propiedades abstractas en las clases abstractas de Python
- 8. C#: ¿Las clases abstractas necesitan implementar interfaces?
- 9. Grandes clases base abstractas
- 10. Clases abstractas en relaciones GORM
- 11. AS3 - clases abstractas
- 12. JAXB y clases abstractas
- 13. Herencia ambigua de clases base abstractas:
- 14. Uso de los genéricos en clases abstractas
- 15. .net Herencia múltiple de las clases abstractas
- 16. Pruebas unitarias Clases abstractas en Groovy
- 17. Alternativas a clases abstractas en Ruby?
- 18. Java: variables finales en las clases abstractas
- 19. scala: creación de instancias de clases abstractas?
- 20. C# tiene clases e interfaces abstractas, ¿debería tener también "mixins"?
- 21. Cómo probar las clases abstractas de unidad
- 22. Registro de Java con clases abstractas
- 23. Uso de WCF con clases abstractas
- 24. Qt interfaces o clases abstractas y qobject_cast()
- 25. ¿Es pitónico utilizar interfaces/clases base abstractas?
- 26. mvc3 razor editortemplate con clases abstractas
- 27. Usando Mockito para probar clases abstractas
- 28. Pruebas unitarias clases abstractas y/o interfaces
- 29. Clases abstractas y Spring MVC @ ModelAttribute/@ RequestParam
- 30. ¿Por qué crear clases e interfaces abstractas?
También puede declarar referencias para clases abstractas como 'foo &'. – iammilind
Porque quiero manipular genéricamente objeto de tipo de forma (por lo tanto, necesito un puntero o referencia a una forma). Pero definitivamente no quiero objetos de forma tipo ya que esta es una abstracción. Necesito objetos que sean cuadrados o círculos. –