2012-02-20 10 views
6

tengo una clase existido y función que se parece a esto:C++: ¿Puedo convertir un vector <derived_class> en un vector <base_class> durante una llamada a función?

Class base_class{ 
    ... 
} 

void Func(...,vector<base_class> &vec_b,...){ 
    // inside the function, the vector vec_b is being re-organized and re-sized 
} 

y he definido una clase derivada que se parece a:

Class derived_class: public base_class{ 
    ... 
} 

Ahora, sin cambiar la función Func, puedo pasar una vector<derived_class> en Func, ex:

void main(){ 
    vector <derived_class> d; 
    Func(...,d,...); 
} 

tal que la clase derivada d sufre la misma reorganización y cambio de tamaño? Sé que puedo convertir la clase derivada a clase base en una llamada a función sin problemas, pero una vez con un vector en juego, parece que hay dificultades? No puedo encontrar la respuesta en línea, por lo que cualquier sugerencia o ayuda es muy apreciada. Gracias.

+2

Tus vectores están reteniendo objetos por valor, no por puntero, por lo que no puedes tener un comportamiento polimórfico de todos modos. Es decir, ¿cuál es el punto? – ildjarn

+0

Relacionados con: http://stackoverflow.com/a/114883/8747. –

+0

Algo relacionado: [http://www2.research.att.com/~bs/bs_faq2.html#conversion](http://www2.research.att.com/~bs/bs_faq2.html#conversion) –

Respuesta

0

La sustitución de un vector de una clase base con un vector de una clase derivada no funcionará si las dos clases tienen diferentes tamaños. Esto se debe a que el vector almacena instancias contiguas del tipo internamente, por lo que el vector de bases podría pensar que el segundo elemento estaba en una ubicación diferente de la que realmente es. Sin embargo, puedes usar vectores de punteros.

+0

¿No sería necesario cambiar el func? – MikMik

2

No, no se puede convertir entre vectores de diferentes tipos. Sin embargo, puede lograr lo que está tratando de hacer haciendo Func una plantilla. Probablemente no requiera que cambie ningún código en el cuerpo de la función real, pero depende de lo que esté haciendo.

template<typename T> 
void Func(..., vector<T> &vec_b, ...){ 
    // inside the function, the vector vec_b is being re-organized and re-sized 
} 
+2

El OP dijo "sin cambiar Func". –

3

No. Incluso si un A es un B, un vector<A> no es un vector<B>.

Para pasar uno en lugar del otro, puede pasar un vector de punteros (o usar un Boost ptr_vector). Alternativamente, puede usar una plantilla para permitir pasar un vector de cualquier cosa que proporcione la interfaz correcta.

Cualquiera de estos requerirá cambiar su función, sin embargo, esencialmente no hay forma de evitar eso (y aún así proporcionar la funcionalidad que desea).

+1

¿Está seguro * puede pasar un vector de punteros * está bien aquí? –

+0

@BartekBanachewicz: Un 'vector ' no es convertible a un 'vector ' --pero los punteros en un 'vector ' pueden apuntar a objetos base o derivados. Sin embargo, si comienza con un 'vector ', le corresponde a usted copiar esos punteros en un 'vector ' antes de pasarlo a la función. –

+0

Oh, veo lo que querías decir ahora. –

2

Puede dejar Func tomar vector <base_class*> y dejar que los elementos puntuales en el punto de vector <base_class*> a derived_class casos.

2

Esto solo funciona si usa punteros.

Si no utiliza punteros, existe la posibilidad de que se produzcan cortes. P.ej.

class Base { 
    protected: 
    int foo; 
}; 

class Child : public Base { 
    int bar; 
}; 

El class Base contiene sólo un único int llamados foo, y la class Child contiene dos intercepciones, foo y bar.

Child f; 
Base sliced = (Child)f; 

Esto cortar el niño, haciendo que se quite algunos de los datos del objeto. No podrá devolver al padre a la clase secundaria, a menos que utilice los punteros.

Por lo tanto, si cambió su vector<> para tener punteros en lugar de instancias de la clase, entonces puede lanzar hacia adelante y hacia atrás entre padre/hijo.

usando algo como:

vector<Base*> vec; 
vec[0] = static_cast<Base*>(new Child()); 

... 
Func(vec); 
... 

le permitiría a emitir los miembros de su vector en sus clases hijas.

Cuestiones relacionadas