Il polimorfismo funziona solo per puntatori e reference. Dato che hai una classe base con i metodi virtuali, occorre memorizzare il puntatore come ti ho fatto vedere.
Per recuperarlo devi fare così:
codice:
std::map<string,ps_power_model>::iterator map_iterator;
map_iterator = power_module_table.find("stringa chiave")
if (map_iterator != power_module_table.end()) {
map_iterator->second->ciao();
}
oppure
codice:
power_module_table["stringa chiave"]->second->ciao();
Personalmente preferisco la prima forma, che permette di controllare se una chiave è già presente.
Per quanto riguarda la memoria. Una volta che allochi un puntatore, devi essere tu a gestire la deallocazione. La STL non ti viene incontro.
codice:
map_iterator = power_module_table.begin();
while (map_iterator != power_module_table.end()) {
delete map_iterator->second;
++map_iterator;
}
power_module_table.erase(power_module_table.begin(),power_module_table.end());
dato che ci sono ti faccio un'altra domanda... se invece dovessi salvare una qualsiasi oggetto all'interno della mappa devo sempre salvare il puntatore????
Se ti interessa il polimorfismo (come in questo caso), si. Però se vuoi salvare oggetti non polimorfici, ricorda che la STL richiede un costruttore di copia e l'operatore di assegmento, pubblici.
P.S.
Per la creazione controllata di oggetti, suggerirei di dare un'occhiata al Pattern Factory.