El título casi lo dice todo. Básicamente, es legal para hacer esto:C++: ¿puede el vector <Base> contener objetos del tipo Derivado?
class Base {
//stuff
}
class Derived: public Base {
//more stuff
}
vector<Base> foo;
Derived bar;
foo.push_back(bar);
Sobre la base de otros mensajes que he visto, lo siguiente es aceptable, pero no quiero utilizar punteros en este caso, porque es más difícil para que sea seguro para subprocesos .
vector<Base*> foo;
Derived* bar = new Derived;
foo.push_back(bar);
¿Por qué es thread- la seguridad de alguna manera relevante aquí? ¿Te refieres a la seguridad de excepción tal vez? Si es así, sí, 'push_back' podría lanzar una excepción, dejando fuera un puntero colgante. Puede usar punteros inteligentes para manejar eso. – DanielKO
@DanielKO Estoy usando un contenedor STL como buffer entre un productor y un hilo de consumidor. No quiero llenar el contenedor con punteros porque, aunque he protegido el contenedor con un mutex, una vez que un hilo tiene un puntero a otros datos, esos datos no están protegidos. – Beezum
Eso en sí mismo no es un problema de seguridad de hilos. Incluso sin punteros uno también puede jugar con los elementos de una manera insegura. Todo lo que tiene que hacer es definir la semántica adecuada para que los contenidos (almacenados como punteros o directamente) no se modifiquen sin los mecanismos de coherencia de concurrencia adecuados. En particular, si teme que un usuario de la clase pueda almacenar un puntero al elemento sin "permiso", ¿qué le hace pensar que no tomará un puntero o una referencia de la misma manera? – DanielKO