Editado
una clasa abstracta se hace haciendo todos sus métodos virtual (delegas todo a la clase derivada) si mal no recuerdo.
#2 Menos el constructor los demás sí, correcto.
Pero eso me da igual, no afecta a mi duda (o al menos así lo entiendo yo).
EDIT: he cambiado algunas cosillas a ver si se entiende mejor
Yo estoy contigo. No creo que se pueda aprovechar el polimorfismo si no usas punteros o referencias.
no lo recuerdo bien (hace demasiado de esto), podías declarar variables del tipo abstracto, para luego poderle endosar objetos de tipos derivados (vamos que heredan de ella)
Por ejemplo tiene la clase animal (abstracta) y luego declaras perro, gato y conejo que heredan de ella. Declaras una pila de clase animal, y puedes hacer push en la pila de objetos perro, gato o conejo indistintamente.
Funciona del mismo modo con listas/loquesea
Respondiendo a tu pregunta del principio... no, no puedes crear objetos de una clase abstracta, pero sí declarar variables o estructuras de datos de esa clase como tipo.
A modo ejemplo
Atleta * javier = new Velocista()
Edit:
De todos modos creo que no necesitas punteros. Un array no deja de ser una colección de punteros, pero no recuerdo bien, ¿esto no te deja hacerlo el compilador?
Atleta atletas[max];
Velocista javier;
atletas[0] = javier;
#1 tu profesor no tiene ni idea, en C++ el polimorfismo solo se puede hacer con punteros/referencias: http://stackoverflow.com/questions/15188894/why-doesnt-polymorphism-work-without-pointers-references
#6 De todos modos lo mismo es que el usar polimorfismo y demás en la práctica es la locura, no sabemos ni qué le pide XD
#9 puedes decirme alguna alternativa que no sea piratear visual? xD Porque ni la uni nos lo presta...
#12 ojo, que si te piden que presentes el proyecto en Eclipse ciñete a el porque cada compilador funciona distinto. Y si quieres un VS gratis, hace poco han sacado el Community que tiene mas cosas que las Express y sigue siendo gratis: https://www.visualstudio.com/en-us/products/visual-studio-community-vs.aspx
#13 no, de hecho nos dijo que daba igual el ide que usasemos. Así que si va mejor el Vs que eclipse... porque el debug es... que asco.
Bueno, ya tengo casi toda la práctica hecha. Y digo casi porque hay una cosa que se me resiste.
Tengo un set con punteros a mi clase abstracta Marca
typedef set<Marca *, classcomp> marcas;
El comparador:
struct classcomp {
bool operator() (const Marca* marca1, const Marca* marca2) {
return marca1 < marca2;
}
};
Y el operador <
bool operator< (const Marca &marca1, const Marca &marca2) {
Marca * m1 = const_cast<Marca *>(&marca1);
Marca * m2 = const_cast<Marca *>(&marca2);
return (m1->getValor() < m2->getValor());
}
Pues nada, que no hay forma de que me los ordene xD
hace tiempo que no hago c++ así que no estoy muy seguro
http://stackoverflow.com/questions/13234106/order-of-elements-in-set-of-pointers
bool operator< (const Marca* marca1, const Marca* marca2) const {
/* implement logic here */
//Marca * m1 = const_cast<Marca *>(&marca1);
//Marca * m2 = const_cast<Marca *>(&marca2);
return (marca1->getValor() < marca2->getValor()); // getValor() debería ser const, y no realizar const_cast
}
pero has hecho el comparador con punteros?
ps: bueno si no es con punteros entonces te tendrá que ayudar otra persona :p
#19 no tiene sentido lo que has hecho, comparas punteros y no valores WTF y para el comparador defines el operador () en lugar de == y lo metes en una estructura, no entiendo
#20 comparo punteros porque mi estructura es de punteros. Y el operador es < no == ya que es para insertar ordenado en un set
Creo que a lo que se refiere #20 es que cuando haces
return marca1 < marca2;
estás comparando dos punteros, es decir, las direcciones de memoria, no los objetos en sí. Entonces no se está usando tu sobrecarga del operador <, sino que se está haciendo una simple comparación de números. Prueba desreferenciando:
return (*marca1) < (*marca2);