paulo1205
(usa Ubuntu)
Enviado em 08/01/2018 - 17:24h
Na verdade, não seria um vetor de elementos da classe base, mas um vetor (ou array) de elementos
ponteiros para a classe base, de modo a que um eventual polimorfismo pudesse funcionar.
Alternativamente, se não se quiser ter uma base comum, pode-se trabalhar com
std::vector<void *> nome_do_vetor ou
void *nome_do_aray[tamanho].
Em qualquer caso, para obter o dado apontado, você teria de ter polimorfismo ou de converter o ponteiro genérico para um ponteiro para o tipo correto de dado antes de o derreferenciar.
void *array_generico[10];
std::vector<void *> vetor_generico;
vetor_generico.push_back(const_cast<char *>("Paulo")); // Aponta para uma constante do programa (depois de desconsiderar o atributo constante).
vetor_generico.push_back(new int(1205)); // Aloca novo inteiro e lhe atribui o valor 1205.
vetor_generico.push_back(array_generico); // Pega o endereço do array (que coincide numericamente com o endereço do primeiro elemento).
for(int n=0; n<std::min(10, vetor_generico.size()); n++){
array_generico[n]=vetor_generico[n]; // ATENÇÃO: Os elementos do vetor e do array apontam para os mesmos dados!
}
std::cout << *static_cast<char *>(vetor_generico[0]) << '\n'; // OK: o tipo do elemento realmente é um array de caracteres que aponta para uma string.
std::cout << *array_generico[1] << '\n'; // ERRO: não posso derreferenciar um ponteiro para void.
std::cout << *static_cast<int *>(vetor_generico[2]) << '\n'; // ALERTA: Funciona, mas pode não fazer sentido, especialmente se sizeof(void *)<sizeof(int).
No código acima, cabe a você lembrar o tipo de cada elemento, bem como se ele deve ou não ser desalocado no momento em que o array ou vetor não for mais necessário.
Você pode ainda tentar variações baseadas em
smart pointers, como
std::vector<std::unique_ptr<void>> ou
std::vector<std::shared_ptr<classe_base>>.