Sí, es posible, y de hecho es necesario utilizar punteros si pretende que su vector contenga objetos de una jerarquía de clases entera en lugar de un solo tipo. (Si no se utilizan los punteros, se generará el temido problema object slicing: todos los objetos se convierten silenciosamente al tipo de clase base. Esto no ha sido diagnosticado por el compilador y es casi seguro que no es lo que usted desea.)
class c
{
void virtual func();
};
class sc:public c
{
void func(){cout<<"using func";}
};
sc cobj;
vector<c*> cvect; // Note the type is "c*"
cvect.push_back(&cobj); // Note the "&"
vector<c*>::iterator citer;
for(citer=cvect.begin();citer != cvect.end();citer++) // Use "!=" not "<"
{
(*citer)->func();
}
Tenga en cuenta que con un vector de punteros, que tiene que hacer su propia gestión de memoria, así que mucho cuidado - si usted va a utilizar objetos locales (como el anterior), no deben caerse de alcance antes que el contenedor. Si utiliza punteros a objetos creados con new
, necesitará delete
manualmente antes de que se destruya el contenedor. Debería considerar utilizar punteros inteligentes en este caso, como el smart_ptr
provisto por Boost
.
func() es una función virtual, así que supongo que se requiere el vector de punteros aquí. – Naveen
ah sí - buen punto –
Y si push_back() arroja, es probable que desee evitar la fuga de la nueva c. – bk1e