2010-04-27 50 views
11

Digamos que tengo un gato clase abstracta que tiene algunas subclases concretas Wildcat, Housecat, etc.¿Cómo crear una matriz dinámica de una clase abstracta?

Quiero que mi matriz para poder almacenar punteros a un tipo de gato sin saber qué tipo es en realidad.

Cuando intento asignar dinámicamente una matriz de Cat, parece que no funciona.

Cat* catArray = new Cat[200]; 

Respuesta

17

Al crear una Aray de punteros a Gato, como en

Cat** catArray = new Cat*[200]; 

Ahora usted puede poner su WildCat, etc casos Housecat, en varios lugares de la matriz, por ejemplo

catArray[0] = new WildCat(); 
catArray[1] = new HouseCat(); 
catArray[0]->catchMice(); 
catArray[1]->catchMice(); 

par de advertencias , cuando termine
a) No olvide eliminar las instancias asignadas en catArray como en delete catArray [0] etc.
b) No se olvide de eliminar el catArray mismo usando

delete [] catArray; 

También debe considerar el uso de vectores para automatizar b) para que

6

Usted tendría que crear una matriz de punteros a Cat:

Cat** catArray = new Cat*[200]; 

Incluso si la clase base Cat era de cemento, a pesar de ello correr de cabeza en object slicing si ha creado una serie de Cat.

Tenga en cuenta que probablemente debería utilizar un std::vector en lugar de una matriz, y probablemente debería utilizar punteros inteligentes para garantizar que su código sea excepcionalmente seguro.

0

No se puede instanciar directamente una instancia de una clase abstracta, sino que se debe instanciar una instancia de una subclase totalmente implementada.

Así que esto es legal:

Housecat* theCats = new Housecat[200]; 

y entonces usted puede acceder a cada gato a través de la interfaz del gato

bool catsMeow = ((Cat*)(&theCats[0]))->CanMeow(); 

Pero el compilador no tiene forma de saber cómo crear una instancia de una clase abstracta; de hecho, el hecho de que sea abstracto significa que no puede ser instanciado directamente.

¿Por qué hacer esto? Porque Cat tendrá un método abstracto

bool CanMeow() = 0; 

que todos los gatos heredados deben implementar. Luego puedes preguntar si puede maullar, con la posibilidad de que una instancia de Lion devuelva false.

4

No se pueden agrupar los gatos en jaulas de tamaño fijo, porque el compilador no tiene forma de saber qué tamaño tendrán los gatos, ni (error de metáfora) cómo inicializarlos. Necesitará hacer algo como inicializar la matriz para anular indicadores de gato o algo, y arreglárselas más tarde.

Cuestiones relacionadas