К сожалению, я не уверен, почему вы вызываете нагрузку рекурсивно, поэтому я не могу дать точный ответ. Я думаю, что ответ, который вы ищете, будет использовать полиморфизм. Это простой пример:
animal.h
#ifndef ANIMAL_H
#define ANIMAL_H
#include <iostream>
#include <string>
class Animal
{
public:
void load()
{
std::string fileName = this->getAnimalFilename() + ".csv";
std::cout << "fileName = " << fileName << std::endl;
}
protected:
virtual std::string getAnimalFilename() { return "Animal"; }
};
#endif //ANIMAL_H
dog.h
#ifndef DOG_H
#define DOG_H
#include <string>
#include <iostream>
class Dog : public Animal
{
protected:
virtual std::string getAnimalFilename() { return "Dog"; }
};
#endif //DOG_H
cat.h
#ifndef CAT_H
#define CAT_H
#include <iostream>
#include <string>
class Cat : public Animal
{
protected:
virtual std::string getAnimalFilename() { return "Cat"; }
};
#endif //CAT_H
И пример использования (обратите внимание, что вы должны использовать указатель на базовый класс, чтобы получить переопределяющую функцию полиморфизма, и вы ДОЛЖНЫ объявить функцию виртуальной, чтобы переопределить ее i n производный класс).
EDIT: приведенный ниже main.cpp был изменен для использования интеллектуальных указателей, поскольку он использовал необработанные указатели и вызвал утечку памяти, отмеченную @ArchbishopOfBanterbury.
main.cpp
#include <iostream>
#include <vector>
#include <string>
#include <memory>
#include "animal.h"
#include "dog.h"
#include "cat.h"
int main(int argc, char *argv[])
{
std::vector<std::unique_ptr<Animal>> animalColl;
animalColl.emplace_back(new Dog());
animalColl.emplace_back(new Cat());
animalColl.emplace_back(new Cat());
animalColl.emplace_back(new Dog());
for (auto &a : animalColl) {
a->load();
}
return 0;
}
И выход:
fileName = Dog.csv
fileName = Cat.csv
fileName = Cat.csv
fileName = Dog.csv
Основная идея заключается в том, что вы используете ключевое слово виртуальный переопределить поведение при использовании указателя на базовый класс. Поэтому в моем примере getAnimalFilename переопределяется в классе Dog и Cat, чтобы вернуть правильную строку, а не передавать ее в функцию load(). Это помогает? Идем дальше и отвечаем на этот комментарий, и я постараюсь помочь как можно больше.
Использовать 'dynamic_cast'? – Arunmu